使用ProcessStartInfo重定向标准输出并提示UAC我正在开发一个面向.NET3.0的WPF应用程序。我需要调用一个需要管理权限的exe。我可以让UAC提示权限:ProcessStartInfostartInfo=newProcessStartInfo();startInfo.Verb="runas";startInfo.UseShellExecute=true;startInfo.FileName="target.exe";进程p=newProcess();p.StartInfo=startInfo;p.开始();我的问题是我需要重定向stdout并使用UseShellExecute=true导致异常提示:ProcessobjectmusthaveUseShellExecutepropertysettofalsetoredirectIOstream但是,将其设置为false会导致UAC不提示权限,我得到一个异常说明:请求的操作需要提升如何重定向标准输出并提示输入UAC?我见过类似的问题,但解决方案是使用app.manifest给我的应用程序管理权限。由于要求,这是我不能做的事情。UseShellExecute必须设置为false才能重定向IO,而true必须设置为true才能使用Verb属性。所以你不能。但是这篇文章看起来很神奇,虽然我还没有测试过。它是用C++编写的,但可以轻松创建一个包装器API,以便使用DllImport从C#调用它。注意:如果您在两个程序之间传递数据并且您可以访问目标程序的源代码,您可以轻松地重新设计您的应用程序以使用命名管道而不是重定向标准I/O。还有一个非常简单的解决方案:如果你想运行一个提升的子可执行文件并重定向输出(可选地包括窗口隐藏),那么你的主要代码也必须提升。这是一项安全要求。为此:在项目文件夹中手动编辑“app.manifest”。查看有关UAC清单选项的评论,您将看到3个“requestedExecutionLevel”示例。在评论下,找到当前启用的棘手的“asInvoker”,并将其替换为“requireAdministrator”。重新启动VisualStudio使其生效,重建应用程序后它应该具有典型的UAC盾牌图标。现在您的代码以及它启动的所有内容都将升级,您还可以捕获输出流。这是VB.NET中的一个例子:以上是C#学习教程:使用ProcessStartInfo重定向标准输出提示UAC共享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——DimstartInfoAsNewProcessStartInfostartInfo.Verb="runas"startInfo.FileName="subprocess-elevated.exe"startInfo.Arguments="arg1arg2arg3"startInfo.WorkingDirectory=Environment.CurrentDirectorystartInfo.WindowStyle。=TrueDimpAsProcess=NewProcess()p.StartInfo=startInfop.StartInfo.UseShellExecute=Falsep.StartInfo.RedirectStandardOutput=Truep.StartInfo.RedirectStandardError=Truep.Start()Console.WriteLine(p.StandardOutput.ReadToEnd)Console.WriteLine(p.StandardError.ReadToEnd)p.WaitForExit()本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
