プログラムによるプロセス特権の昇格?


147

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.UseShellExecute = true;さらに追加した後、startInfo.Verb = "runas";それは私にとってはうまくいきました。
マット

回答:


172

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

startInfo.Verb = "runas";

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

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

編集:質問を編集して、「runas」が機能しないと述べたようです。それは本当に奇妙なことです(実際のところ、いくつかのプロダクションアプリではそうです)。ただし、マニフェストを埋め込むことによって上位の権限で実行するように親プロセスに要求することは、確実に機能するはずです。


9
「runas」も私にとってはうまくいきませんでした。UACがオフの場合にのみ機能する可能性がありますか?
Dirk Vollmar、2009

18
@LukePuplett感謝します。これは、実際にユーザーの役割を完全に分離することなく、ルートキットのインストールを軽減する優れた方法です。
コルトン2013年

6
@Sparksis、しかし別の見方もあります。OSを守る方法を知っている人々は、UACなしでそれを行う方法を知っています。そして、防御力がわからないダミーユーザーは、UACウィンドウが表示されるたびに[はい]をクリックします。また、悪意のあるハッカーウイルスライターがエクスプロイトを使用してバイパスするのを防ぐことはできません;)したがって、私はLukePuplettに同意します=)
Jet

24
startInfo.ShellExecute=trueこれを機能させるには、同様に設定する必要があるようです...また、このメソッドでネットワーク共有上の実行可能ファイルを操作できませんでした(実行する前にローカルの一時ディレクトリにコピーする必要があります)。 ..
TCC 2013

7
@ジェット申し訳ありませんが、それは間違った考え方です。インストール中にUACダイアログが表示されるたびに、それはシステムの障害です。価値があるのは、昇格が必要なものを実行せずにUACボックスが表示される場合です。あなた-私たちの誰でも-私たちが自分のPC上にいると思っていても、ゼロデイ/ドライブバイダウンロード(例えば、ノーベル賞の公式サイトでの最近のもの)を魔法のようにブロックすることはできません。そのサイトにアクセスしてUACプロンプトが表示された場合、何か問題があったことがわかります。UACをオフにすると、ボットネットに参加したことを知ることはできません。事前警告のコストは、はい時折クリックする必要がされて
基本

46

このコードは、上記すべてをまとめて、現在の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が実行されなかった場合、メインウィンドウが壊れ、特定の競合状態でこれが発生しました。


改善点は以下をご覧ください。
JCCyC 2014

requireAdministratorは私の場合は機能しませんでした。だから私はあなたのやり方でそれをしなければなりませんでした。これは私の問題を解決しました!ありがとうございました。しかし、私は単一インスタンスアプリケーションをfalseに設定する必要がありました。
クリス、2015年

これでうまくいきました。また、元のstring[] argsプロセスをリスポーンしたプロセスに渡しました。
DotNetPadawan


7
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

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


3
このコードを使用すると、「セキュリティエンティティのアクセス許可の要求に失敗しました」というアクセス許可エラーが発生します。:(
Leonardo

おそらく「実行中のユーザーが管理者のメンバーである場合」*
hB0

1
興味深い-これはアクションメソッドだけでなく、どのメソッドでも実行できます(ASPXページで定義されたメソッドで試してみました)
Simon_Weaver

1

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

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

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


28
accessTokenを取得する方法はまだ述べていません。UACが有効な場合、LogonUserはユーザーの制限されたセキュリティコンテキストを提供します。
cwa 2011年

VSTSを使用している場合は、Webポータルの設定からパーソナルアクセストークンを取得できます。(ユーザー画像の横にある設定アイコンを探します。)MSDocs
Su Llewellyn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.