以更高的权限启动进程并读取其输出

本文关键字:读取 输出 进程 启动 权限 | 更新日期: 2023-09-27 18:21:14

我们需要在正常进程中启动一个具有所需管理权限(在其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();
}

以更高的权限启动进程并读取其输出

我最终使用了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!>>")
    ...