5

.NET 3.0 をターゲットとする WPF アプリケーションに取り組んでいます。管理者権限が必要なexeを呼び出す必要があります。次のようなものを使用して、UAC に許可を求めるプロンプトを表示させることができます。

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.Verb = "runas";
startInfo.UseShellExecute = true;
startInfo.FileName = "target.exe";

Process p = new Process();
p.StartInfo = startInfo;
p.Start();

私の問題は、標準出力をリダイレクトする必要があることです。そうすると、次のようUseShellExecute = trueな例外が発生します。

IO ストリームをリダイレクトするには、Process オブジェクトの UseShellExecute プロパティを false に設定する必要があります。

ただし、false に設定すると、UAC は許可を求めるプロンプトを表示せず、次のような例外が発生します。

要求された操作には昇格が必要です

標準出力をリダイレクトして UAC のプロンプトを表示するにはどうすればよいですか?

この同様の質問を見たことがありますが、解決策は app.manifest を使用してアプリケーションに管理者権限を与えることです。これは、要件のために私ができないことです。

4

2 に答える 2

3

UseShellExecutefalseIO をリダイレクトし、プロパティtrueを使用するには、に設定する必要がありVerbます。だから、できません。

しかし、私はテストしていませんが、この記事は魔法のようです。

これは C++ で記述されていますが、C# から呼び出されるようにラッパー API を簡単に作成できますDllImport


注: 2 つのプログラム間でデータを渡し、ターゲット プログラムのソース コードにアクセスしたい場合は、Named Pipes標準 I/O をリダイレクトする代わりに使用するアプリケーションを簡単に再設計できます。

于 2013-10-15T12:39:37.170 に答える
3

別の非常に簡単な解決策があります。

昇格した子実行可能ファイルを実行し、出力をリダイレクトする (オプションでウィンドウの非表示を含む) 場合は、メイン コードも昇格して実行する必要があります。これはセキュリティ要件です

これを行うには:

  1. app.manifestプロジェクト フォルダー内の を手動で編集します。
  2. UAC マニフェスト オプションに関するコメントを見つけると、 の 3 つの例が表示されますrequestedExecutionLevel
  3. コメントの下で、asInvoker現在有効になっているトリッキーを見つけて、に置き換えrequireAdministratorます。
  4. 有効にするために Visual Studio を再起動します。アプリを再ビルドすると、通常の UAC シールド アイコンが表示されます。

これで、コードが昇格して実行され、起動するものもすべて昇格され、出力ストリームをキャプチャすることもできます. VB.NET での例を次に示します。

Dim startInfo As New ProcessStartInfo
startInfo.Verb = "runas"
startInfo.FileName = "subprocess-elevated.exe"
startInfo.Arguments = "arg1 arg2 arg3"
startInfo.WorkingDirectory = Environment.CurrentDirectory
startInfo.WindowStyle = ProcessWindowStyle.Hidden
startInfo.CreateNoWindow = True
Dim p As Process = New Process()
p.StartInfo = startInfo
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.StartInfo.RedirectStandardError = True
p.Start()
Console.WriteLine(p.StandardOutput.ReadToEnd)
Console.WriteLine(p.StandardError.ReadToEnd)
p.WaitForExit()
于 2017-02-23T18:17:31.810 に答える