21

昇格された特権でウィンドウを非表示にして、子プロセス(実際には同じコンソールアプリ)を開始したいと思います。

次に行います:

var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location)
{
    UseShellExecute = true, // !
    Verb = "runas", 
};

var process = new Process
{
    StartInfo = info
};

process.Start();

そしてこれは機能します:

var identity = new WindowsPrincipal(WindowsIdentity.GetCurrent());
identity.IsInRole(WindowsBuiltInRole.Administrator); // returns true

しかしUseShellExecute = true、新しいウィンドウが作成され、出力をリダイレクトすることもできません。

だから私が次にするとき:

var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location)
{
    RedirectStandardError = true,
    RedirectStandardOutput = true,
    UseShellExecute = false, // !
    Verb = "runas"
};

var process = new Process
{
    EnableRaisingEvents = true,
    StartInfo = info
};

DataReceivedEventHandler actionWrite = (sender, e) =>
{
    Console.WriteLine(e.Data);
};

process.ErrorDataReceived += actionWrite;
process.OutputDataReceived += actionWrite;

process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();

これは特権を昇格させず、上記のコードはfalseを返します。なぜ??

4

3 に答える 3

21

ProcessStartInfo.Verbは、プロセスがShellExecuteEx()によって開始された場合にのみ効果があります。UseShellExecute=trueが必要です。I / Oのリダイレクトとウィンドウの非表示は、プロセスがCreateProcess()によって開始された場合にのみ機能します。UseShellExecute=falseが必要です。

まあ、それがうまくいかない理由です。UACをバイパスする隠しプロセスを開始することを禁止することが意図的であったかどうかはわかりません。おそらく。 おそらく

このQ+Aで、UAC高度プロンプトを表示するために必要なマニフェストを確認してください。

于 2010-08-29T19:58:59.513 に答える
9

私の場合、昇格された子プロセスが完了したら、出力を取得しても問題ありませんでした。これが私が思いついた解決策です。一時ファイルを使用します:

var output = Path.GetTempFileName();
var process = Process.Start(new ProcessStartInfo
{
    FileName = "cmd",
    Arguments = "/c echo I'm an admin > " + output, // redirect to temp file
    Verb = "runas", // UAC prompt
    UseShellExecute = true,
});
process.WaitForExit();
string res = File.ReadAllText(output);
// do something with the output
File.Delete(output);
于 2016-03-17T11:27:23.103 に答える
0

この答えを確認してください。

これは回避策を提供するようです。ただし、子プロセスのソースコードにアクセスできる場合は、名前付きパイプなどの他の方法を試すことをお勧めします。

于 2013-10-15T13:07:54.840 に答える