157

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

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

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

管理者特権のコマンドプロンプトからコマンドライン構文を実行すると機能します。私のアプリから実行すると(上記のコードを使用して)、実行されません。プロセスの昇格の問題を扱っていると思いますが、プロセスを昇格した状態で実行するにはどうすればよいですか?これを調べる必要がありますShellExecuteか?

これはすべてWindowsVista上にあります。管理者権限に昇格したVS2008デバッガーでプロセスを実行しています。

設定もしてみstartInfo.Verb = "runas";ましたが、うまくいかなかったようです。

4

6 に答える 6

184

次のように、startInfo オブジェクトの Verb プロパティを「runas」に設定することで、昇格されたアクセス許可で新しいプロセスを開始する必要があることを示すことができます。

startInfo.Verb = "runas";

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

これは、UAC プロンプトが表示され、ユーザーが確認する必要があることを意味します。これが望ましくない場合 (たとえば、長いプロセスの途中で発生するため)、ホスト プロセス全体を次のコマンドで実行する必要があります。アプリケーション マニフェスト (UAC) の作成と埋め込みによる昇格されたアクセス許可により、'highestAvailable' 実行レベルが要求されます。これにより、アプリが開始されるとすぐに UAC プロンプトが表示され、すべての子プロセスが追加のプロンプトなしで昇格されたアクセス許可で実行されます。 .

編集:質問を編集して、「runas」が機能しなかったと述べているようです。当然のことながら、これは本当に奇妙です (そして、いくつかの製品アプリで私にとってそうです)。ただし、マニフェストを埋め込むことにより、昇格された権限で実行する親プロセスを要求することは間違いなく機能するはずです。

于 2008-09-25T13:57:54.073 に答える
53

このコードは上記をすべてまとめて、現在の wpf アプリを管理者権限で再起動します。

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 が実行されていない場合、メイン ウィンドウが爆発し、特定の競合状態でこれが発生しました。

于 2012-06-05T22:12:08.690 に答える
22

記事Chris Corio: Teach Your Apps To Play Nicely With Windows Vista User Account Control (MSDN マガジン、2007 年 1 月) によると、埋め込まれたマニフェストのみShellExecuteをチェックし、必要に応じてユーザーに昇格を求めるプロンプトを表示しますがCreateProcess、他の API はそうしません。それが役に立てば幸い。

参照: .chm と同じ記事

于 2008-10-23T23:56:19.950 に答える
8
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

これにより、UAC なしで実行できます。新しいプロセスを開始する必要はありません。私の場合、実行中のユーザーが管理者グループのメンバーである場合。

于 2012-01-12T08:43:21.440 に答える
1

偽装を使用して状態を昇格する必要があります。

WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();

完了したら、偽装されたコンテキストを元に戻すことを忘れないでください。

于 2008-09-25T13:53:55.983 に答える