【发布时间】:2013-09-10 16:27:59
【问题描述】:
我正在开发一个面向 .NET 3.0 的 WPF 应用程序。我需要调用一个需要管理权限的 exe。我可以让 UAC 使用类似的方式提示许可:
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.Verb = "runas";
startInfo.UseShellExecute = true;
startInfo.FileName = "target.exe";
Process p = new Process();
p.StartInfo = startInfo;
p.Start();
我的问题是我需要重定向标准输出,并且使用UseShellExecute = true 这样做会导致异常说明:
Process 对象的 UseShellExecute 属性必须设置为 false 为了重定向 IO 流
但是,将其设置为 false 会导致 UAC 不提示许可,并且我收到异常说明:
请求的操作需要提升
如何重定向标准输出并提示 UAC?
我见过this similar question,但是解决方案是使用 app.manifest 授予我的应用程序管理权限。由于要求,这是我无法做到的。
【问题讨论】:
-
基于我在许多应用程序中看到的有关特殊运行属性的行为(例如,作为 shell),我假设 UAC 在这些情况下不会按设计提示。根据您的描述,这是我可以右键单击并以管理员身份运行的程序。
-
您可以编写一个实用程序 ElevateRedir.exe 来帮助您。例如,“ElevateRedir.exe /port 54321 /path Target.exe”。 ElevateRedir 将使用通过 STDOUT 重定向接收的套接字将来自 Target.exe 的输出发送回您的应用程序。您将以管理员身份启动 ElevateRedir,它可以启动 Target.exe(我相信现在不需要 runas,因为父进程是管理员)。重定向它的标准输出,并通过预定义的套接字端口将其转发到您的应用程序。您的初始应用程序只需要侦听 TCP 端口即可获得输出
-
你能测试名称管道吗?或者你可以测试 UseShellExecute =, true and Verb = runas, and process.ErrorDataReceived += actionWriteEvent ?或者您可以测试@Alan 解决方法