12

サービスと実行可能ファイルで構成されるアプリケーションがあります。基本的には、特定の状況下でサービスを開始および停止する役割を担うフォーム アプリケーションです。

Windows XP では、アプリケーションは次のコードを使用してこの問題を管理します。

ServiceController controller = new ServiceController();
controller.MachineName = ".";
controller.ServiceName = "XXXXXXXXXX";
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 10));
controller.Start();

しかし、Windows 7 では、アプリケーションを管理者として起動したにもかかわらず、次の例外が発生します。

System.InvalidOperationException: Cannot open XXXXXXXXXXXXX service on computer '.'. ---> System.ComponentModel.Win32Exception: Access is denied
   --- End of inner exception stack trace ---
   at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
   at System.ServiceProcess.ServiceController.Start(String[] args)
   at System.ServiceProcess.ServiceController.Start()

これを解決するためにプログラムでできることはありますか?

4

3 に答える 3

13

管理者としてアプリケーションを起動したと言うとき、それは管理者グループのアカウントの下で、または管理者の資格情報を要求する UAC プロンプトを介してという意味ですか? UAC 資格情報のプロンプトが表示されない場合 (または、管理者グループ内のアカウントではなく管理者アカウントとして実際に実行されている場合)、アプリケーションにはサービスを変更する権限がないため、表示されている例外は正しいものです。

このサンプル コードは、アプリケーションが管理者として実行されているかどうかを確認し、そうでない場合は UAC プロンプトを起動します。

public static class VistaSecurity
{
    public static bool IsAdministrator()
    {
        WindowsIdentity identity = WindowsIdentity.GetCurrent();

        if (null != identity)
        {
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }

        return false;
    }

    public static Process RunProcess(string name, string arguments)
    {
        string path = Path.GetDirectoryName(name);

        if (String.IsNullOrEmpty(path))
        {
            path = Environment.CurrentDirectory;
        }

        ProcessStartInfo info = new ProcessStartInfo
        {
            UseShellExecute = true,
            WorkingDirectory = path,
            FileName = name,
            Arguments = arguments
        };

        if (!IsAdministrator())
        {
            info.Verb = "runas";
        }

        try
        {
            return Process.Start(info);
        }

        catch (Win32Exception ex)
        {
            Trace.WriteLine(ex);
        }

        return null;
    }
}
于 2010-10-08T15:52:28.530 に答える
3

参考までに、現在のユーザーが管理者グループに属している場合でも、Vista または 7 で機能しない理由がわからない場合は、MSDN の説明をご覧ください。

Windows Vista では、ユーザー アカウント制御 (UAC) によってユーザーの特権が決定されます。Built-in Administrators グループのメンバーである場合、標準ユーザー アクセス トークンと管理者アクセス トークンの 2 つのランタイム アクセス トークンが割り当てられます。デフォルトでは、標準ユーザー ロールになっています。管理者特権を必要とするタスクを実行しようとする場合、[同意] ダイアログ ボックスを使用して、ロールを動的に昇格させることができます。IsInRole メソッドを実行するコードは、[同意] ダイアログ ボックスを表示しません。組み込みの管理者グループに属している場合でも、標準ユーザー ロールに属している場合、コードは false を返します。アプリケーション アイコンを右クリックし、管理者として実行することを示すことで、コードを実行する前に権限を昇格できます。

7を使っていた時は1stでかなりビックリした記憶があります(Vistaは使ったことありません)。

于 2011-10-12T03:33:48.123 に答える
1

コードでアプリケーションの UAC を「管理者として実行」に設定することもできます。

于 2010-11-24T08:16:21.297 に答える