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)の作成と埋め込みによる昇格された権限 「highestAvailable」実行レベルが必要:これにより、アプリが起動するとすぐにUACプロンプトが表示されます。追加のプロンプトを表示せずに、すべての子プロセスを昇格された権限で実行します。
編集:質問を編集して、「runas」が役に立たなかったと述べています。当然のことながら、それは本当に奇妙です(いくつかのプロダクションアプリでも同じです)。ただし、マニフェストを埋め込むことで親プロセスを高い権限で実行するように要求することは間違いなく機能します。
このコードは上記のすべてをまとめ、現在のwpfアプリをadmin privsで再起動します。
if (IsAdministrator() == false)
{
// Restart program and run as admin
var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
startInfo.Verb = "runas";
System.Diagnostics.Process.Start(startInfo);
Application.Current.Shutdown();
return;
}
private static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
// To run as admin, alter exe manifest file after building.
// Or create shortcut with "as admin" checked.
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas".
// Or an elevate vbs script can launch programs as admin.
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass)
更新:アプリマニフェストの方法が推奨されます。
Visual Studioでプロジェクトを右クリックして、新しいアプリケーションマニフェストファイルを追加し、ファイルを変更して、上記のようにrequireAdministratorを設定します。
元の方法の問題:再起動コードをapp.xaml.cs OnStartupに入れると、Shutdownが呼び出されたにもかかわらず、メインウィンドウが短時間起動する場合があります。 app.xaml.cs initが実行されておらず、特定の競合状態ではこれが実行されると、メインウィンドウが爆発しました。
記事によると Chris Corio:アプリをWindows Vistaユーザーアカウント制御でうまく再生するように教える、MSDN Magazine、2007年1月 =、ShellExecute
のみが埋め込みマニフェストをチェックし、必要に応じてユーザーに昇格を要求しますが、CreateProcess
およびその他のAPIはそうではありません。それが役に立てば幸い。
。chmと同じ記事 も参照してください。
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]
これにより、UACなしで実行できます。新しいプロセスを開始する必要はありません。私の場合、実行中のユーザーが管理者グループのメンバーである場合。
状態を上げるには、偽装を使用する必要があります。
WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();
完了したら、偽装コンテキストを元に戻すことを忘れないでください。