Перенаправить стандартный вывод и запрос для 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
вместо перенаправления стандартного ввода / вывода.
Есть еще одно довольно простое решение:
Если вы хотите запустить дочерний исполняемый файл с повышенными правами и перенаправить вывод (опционально, включая скрытие окна), то ваш основной код также должен быть запущен с повышенными правами. Это требование безопасности.
Для этого:
- Вручную отредактируйте ваш "app.manifest" в папке вашего проекта.
- Найдите комментарий относительно параметров манифеста UAC, вы увидите 3 примера "requestedExecutionLevel".
- Под комментарием найдите хитрый "asInvoker", который в настоящее время включен, и замените его на "requireAdministrator".
- Перезапустите 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()