Повышение привилегий не работает с UseShellExecute = false

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

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

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. Почему ??

18
задан abatishchev 29 August 2010 в 19:41
поделиться

1 ответ

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

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

Отметьте эти вопросы и ответы для получения манифеста, необходимого для отображения запроса на повышение прав UAC.

18
ответ дан 30 November 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: