web-dev-qa-db-ja.com

非管理アプリケーションから管理者としてプロセスを実行する

管理者として実行されていないアプリケーションから、次のコードがあります。

ProcessStartInfo proc = new ProcessStartInfo();
proc.WindowStyle = ProcessWindowStyle.Normal;
proc.FileName = myExePath;
proc.CreateNoWindow = false;
proc.UseShellExecute = false;
proc.Verb = "runas";

Process.Start(proc)を呼び出すと、管理者として実行する許可を求めるポップアップが表示されず、exeは管理者として実行されません。

MyExePathにある実行可能ファイルにapp.manifestを追加して、requestedExecutionLevelを

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

更新されたapp.manifestのProcess.Start(proc)呼び出しで、「要求された操作には昇格が必要です」という例外が表示されます。

.Verbアクションが管理者権限を設定しないのはなぜですか?

Windows Server 2008 R2 Standardでテストしています。

29
jkh

あなたmustShellExecuteを使用します。 ShellExecuteは、昇格するためにConsent.exeを起動する方法を知っている唯一のAPIです。

サンプル(.NET)ソースコード

C#では、ShellExecuteを呼び出す方法は、Process.StartとともにUseShellExecute = trueを使用することです。

private void button1_Click(object sender, EventArgs e)
{
   ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");
   info.UseShellExecute = true;
   info.Verb = "runas";
   Process.Start(info);
}

優れた開発者になりたい場合は、ユーザーがクリックしたときにキャッチできますNo

private void button1_Click(object sender, EventArgs e)
{
   const int ERROR_CANCELLED = 1223; //The operation was canceled by the user.

   ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");
   info.UseShellExecute = true;
   info.Verb = "runas";
   try
   {
      Process.Start(info);
   }
   catch (Win32Exception ex)
   {
      if (ex.NativeErrorCode == ERROR_CANCELLED)
         MessageBox.Show("Why you no select Yes?");
      else
         throw;
   }
}

ボーナスウォッチング

  • AC-何。どのように。なぜ。 。 UACのアーキテクチャは、CreateProcessが昇格できないことを説明し、プロセスを作成するだけです。 ShellExecuteはConsent.exeの起動方法を知っている人で、Consent.exeはグループポリシーオプションを確認する人です。

:パブリックドメインにリリースされたコード。帰属は必要ありません。

50
Ian Boyd