【问题标题】:Start process with higher privileges and read its output以更高权限启动进程并读取其输出
【发布时间】:2014-11-02 15:29:37
【问题描述】:

我们需要在正常进程中启动具有所需管理员权限(在其 app.manifest 中定义)的进程并读取其输出。在我看来,为了启动具有更高权限的进程,我们需要设置UseShellExecute = true。但这会阻止我们接收标准输出。
这是我的代码 sn-p,但它也需要当前进程具有管理员权限(我们负担不起,因为它是一个巨大的应用程序,这是唯一需要提升的部分):

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

【问题讨论】:

    标签: c# .net process elevated-privileges admin-rights


    【解决方案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!>>")
        ...
    

    【讨论】:

    • 也许最好使用new SecurityIdentifier(WellKnownSidType.WorldSid, null); 而不是未本地化的@"Everyone"
    猜你喜欢
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多