質問

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

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()

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

役に立ちましたか?

解決

管理者としてアプリケーションを開始したと言うとき、管理者グループのアカウントの下、または管理者の資格情報を要求する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;
    }
}

他のヒント

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

参考までに、現在のユーザーが管理者グループに属していても、なぜVistaや7で動作していないのかわからない場合は、MSDNが言わなければならないことは次のとおりです。

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

7を使用したとき、私は1日に非常に驚いたことを覚えています(私はVistaを使用したことはありません)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top