Повышение привилегий не работает с UseShellExecute = false - PullRequest
17 голосов
/ 29 августа 2010

Я хочу запустить дочерний процесс (в действительности то же самое, консольное приложение) с повышенными привилегиями, но со скрытым окном.

Я делаю следующее:

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();

Это не 't повысить привилегии и приведенный выше код возвращает false.Почему ??

Ответы [ 3 ]

18 голосов
/ 29 августа 2010

ProcessStartInfo.Verb будет иметь эффект, только если процесс запущен ShellExecuteEx ().Для чего требуется UseShellExecute = true.Перенаправление ввода-вывода и скрытие окна могут работать только в том случае, если процесс запущен CreateProcess ().Для чего требуется UseShellExecute = false.

Ну вот почему это не работает.Не уверен, что запрет на запуск скрытого процесса в обход UAC был преднамеренным.Наверное. Очень вероятно.

Проверьте этот Q + A для манифеста, необходимого для отображения запроса на повышение прав UAC.

7 голосов
/ 17 марта 2016

В моем случае было нормально получить выходные данные после завершения дочернего процесса с повышенными правами. Вот решение, которое я придумал. Используется временный файл:

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);
0 голосов
/ 15 октября 2013

Отметьте этот ответ .

Похоже, что это обходной путь. Но я рекомендую попробовать другие методы, такие как Named Pipes , когда у вас есть доступ к исходному коду дочернего процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...