Перенаправить стандартный вывод и запрос для UAC с ProcessStartInfo

Я работаю над приложением WPF для.NET 3.0. Мне нужно вызвать 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 приводит к исключению, утверждающему, что:

У объекта Process должно быть свойство UseShellExecute, установленное в false, для перенаправления потоков ввода-вывода.

Однако, если установить значение false, UAC не запрашивает разрешения, и я получаю исключение, в котором говорится:

Запрошенная операция требует возвышения

Как я могу перенаправить стандартный вывод и запросить UAC?

Я видел этот похожий вопрос, однако решение состоит в том, чтобы использовать app.manifest, чтобы дать моему приложению административные привилегии. Это то, что я не могу сделать из-за требований.

2 ответа

Решение

UseShellExecute должен быть установлен в false перенаправить IO, и true использовать Verb имущество. Так что ты не можешь.

Но эта статья, кажется, делает волшебство, хотя я не проверял это.

Он написан на C++, но API-оболочка может быть легко создана для вызова из C# с помощью DllImport,


Примечание. Если вы хотите передавать данные между двумя программами и иметь доступ к исходному коду целевой программы, вы можете легко перепроектировать приложение для использования. Named Pipes вместо перенаправления стандартного ввода / вывода.

Есть еще одно довольно простое решение:

Если вы хотите запустить дочерний исполняемый файл с повышенными правами и перенаправить вывод (опционально, включая скрытие окна), то ваш основной код также должен быть запущен с повышенными правами. Это требование безопасности.

Для этого:

  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()
Другие вопросы по тегам