1. ホーム
  2. c#

[解決済み] プログラムによるプロセス権限の昇格?

2022-04-28 16:57:16

質問

InstallUtil.exe を使用してサービスをインストールしようとしていますが、InstallUtil.exe を介して呼び出されます。 Process.Start . 以下はそのコードです。

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);

ここで m_strInstallUtil は "InstallUtil.exe" への完全修飾パスと exe です。 strExePath は、私のサービスの完全修飾パス/名前です。

昇格したコマンドプロンプトからコマンドライン構文を実行すると動作しますが、私のアプリから(上記のコードを使用して)実行すると動作しません。プロセスの昇格の問題があると思いますが、どのようにプロセスを昇格した状態で実行すればよいのでしょうか?そのためには ShellExecute ということでしょうか?

これはすべてWindows Vistaでの話です。VS2008のデバッガで管理者権限に昇格してプロセスを実行しています。

という設定も試してみました。 startInfo.Verb = "runas"; が、問題解決には至らなかったようです。

解決方法は?

次のように startInfo オブジェクトの Verb プロパティを 'runas' に設定することで、新しいプロセスを昇格した権限で開始するように指示できます。

startInfo.Verb = "runas";

これにより、Windowsはエクスプローラから"管理者として実行"メニューコマンドでプロセスを開始したかのように動作します。

この場合、UACプロンプトが表示され、ユーザーが確認する必要があります。これが望ましくない場合(たとえば、長いプロセスの途中で発生するため)、次の方法で、ホストプロセス全体を昇格した権限で実行する必要があります。 アプリケーションマニフェストの作成と埋め込み (UAC) これにより、アプリが起動するとすぐに UAC プロンプトが表示され、すべての子プロセスが追加のプロンプトなしで昇格したアクセス権で実行されます。

Edit: 質問を編集して、"runas"がうまくいかなかったと書かれているのを見ました。それはとても奇妙なことで、そうする必要があります(そして、いくつかのプロダクションアプリケーションで私はそうしています)。マニフェストを埋め込むことによって、親プロセスを昇格した権限で実行するように要求することは、間違いなく機能するはずです。