1

管理者としていくつかのことを行う必要がある ac# アプリケーションがあり (いくつかのインストール作業)、それから非管理者として別のプロセスを実行する必要があります。私は以前に UAC で何もしたことがありませんが、これを行う方法があるに違いないと思いますよね?

これも自動化する必要があるため、C# アプリは管理者の資格情報で開始されると想定します。

基本的に、プログラムは次のようにする必要があります。

// MUST run this process as admin
Process adminInstall = new Process();
adminInstall.StartInfo.FileName = "install.bat";
adminInstall.Start();
adminInstall.WaitForExit();

// CANNOT run this process as admin
Process nonAdminProcess = new Process();
nonAdminProcess.StartInfo.FileName = "runner.cmd";
nonAdminProcess.StartInfo.UseShellExecute = false;
nonAdminProcess.StartInfo.RedirectStandardOutput = true;
nonAdminProcess.OutputDataReceived += new DataReceivedEventHandler(myHandler);
nonAdminProcess.Start();
nonAdminProcess.BeginOutputReadLine();
nonAdminProcess.WaitForExit();
4

4 に答える 4

3

バイナリがコンパイルされた後、署名される前に、プラットフォーム SDK で MT.exe (マニフェスト ツール) を使用して実行可能ファイルにマニフェストを埋め込むことができます。プロジェクト プロパティ内でカスタム マニフェストを使用するオプションもあります。プロジェクトのプロパティを開き、[アプリケーション] タブに移動して、マニフェスト オプションを既定のマニフェストからカスタム マニフェストに変更します。Visual Studio は、"requireAdministrator" 特権を指定できるプロジェクトにマニフェストを追加します。アプリを実行すると、UAC プロンプトが表示されるか、ユーザーとしてログオンしている場合は資格情報が求められます。サブプロセスも管理者として開始される可能性が高くなります。それ以外の場合は、文書化されていない「runas」動詞でそれらを起動する必要があります。

于 2012-11-08T18:54:14.070 に答える
0

Process.Start パラメータには、Username 用のパラメータがあります。Process.Start リファレンスを参照してください。

http://msdn.microsoft.com/en-us/library/sxf2saat.aspx

于 2012-09-26T01:17:56.350 に答える
0

.Net クラスを使用してこれを行う良い方法はないようです。ただし、UAC をオンにして別の資格情報を使用する Process.Startでは、別のプロセスからハンドルを盗んだ後に CreateProcessAsUserW を使用してそれを行う方法について説明しています。

于 2012-09-26T01:18:19.243 に答える
0

前述の方法が実行できない場合は、私の方法を試すことができます。しかし、それは醜いです。管理者以外のプロセスへのハンドルを取得し、DuplicateTokenEx(p/invoke) を使用してその (管理者以外の) 権限をコピーし、それを に渡す必要がありCreateProcessAsUserます。ただし、最初に非管理プロセスを特定する必要がありますが、存在しない場合があります。新しく作成されたプロセスは、親プロセスのトークンではなく、コピーしたトークンに含まれていた特権で生成されます。

于 2012-09-26T02:07:25.497 に答える