Запустите процесс с более высокими привилегиями и прочитайте его вывод

Нам нужно запустить процесс с необходимыми правами администратора (определенными в его app.manifest) в обычном процессе и прочитать его вывод. Как я вижу, для того, чтобы начать процесс с более высоким правом, нам нужно установить UseShellExecute = true, Но это мешает нам получить стандартный вывод.
Вот мой фрагмент кода, но для текущего процесса тоже нужны привилегии администратора (что мы не можем себе позволить, поскольку это огромное приложение, и это единственный раздел, требующий повышения прав):

if (bAdmin)
{
    Process p = new Process
    {
        StartInfo =
        {
            Arguments = "-GetRestorePoints",
            FileName = Environment.CurrentDirectory + @"\Hamekare.AdminSettings.exe",
            CreateNoWindow = true,
            WindowStyle = ProcessWindowStyle.Hidden,
            RedirectStandardOutput = true,
            UseShellExecute = false
        }
    };

    p.OutputDataReceived += p_OutputDataReceived;
    p.Start();
    p.BeginOutputReadLine();
}

1 ответ

Решение

Я в конечном итоге с помощью Named Pipes,
Сервер:

PipeSecurity ps = new PipeSecurity();
PipeAccessRule psRule = new PipeAccessRule(@"Everyone", PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow);
ps.AddAccessRule(psRule);
var server = new NamedPipeServerStream("HKBackUpRestorePipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 1, 1, ps);
server.WaitForConnection();

StreamWriter writer = new StreamWriter(server);
writer.WriteLine ...
writer.Flush();

Клиент:

var client = new NamedPipeClientStream("HKBackUpRestorePipe");
client.Connect();
StreamReader reader = new StreamReader(client);
StreamWriter writer = new StreamWriter(client);

string line;

while ((line = reader.ReadLine()) != "\t\t<<Finished!>>")
    ...
Другие вопросы по тегам