【发布时间】:2017-09-20 13:00:50
【问题描述】:
我正在尝试在 Windows 中创建一个具有提升权限的子进程(通过触发 UAC 提示符)并让该子进程继承其父 STDOUT 句柄,以便能够输出回父控制台。
附加信息:
- Win32 API
- 我目前使用
ShellExecuteEx()和ShellExecuteInformation,它指定一个“runas”动词来触发 UAC,但任何其他可以创建当前运行程序的提升副本的解决方案(子进程与父母),但能够输出回父母的控制台。
【问题讨论】:
-
看看Vista UAC: The Definitive Guide。从“通过 ShellExecuteEx() 路由”开始阅读。他正在通过使用命名管道和使用
ShellExecuteEx创建的中间辅助进程进行重定向,而ShellExecuteEx又调用CreateProcess以便能够将命名管道句柄继承到实际的子进程(如果我理解正确的话)。跨度> -
是的@zett42 但是在我看来这个解决方案看起来真的很hacky......当我绝望但我还没有在这里时,我擅长spagethi编码:P
-
我认为您不会为此找到“简单”的方法。一旦你开始做不同寻常的事情,UAC 很快就会变得一团糟。无论如何,如果您害怕意大利面,只需将所有这些乱七八糟的东西包装到您自己漂亮的界面中即可。 ;-)
-
如果您无法修改子进程以将输出发送到指定的控制台,您将需要一个代理进程来代表您启动子进程。运行提升的代理进程,并在启动子进程之前将其连接回您的控制台。 (基本上与 zett42 建议的过程相同,但针对您的特定场景进行了简化。)
-
...顺便说一句,我向您保证,任何不涉及代理进程的解决方案都将更加骇人听闻!
标签: c++ winapi parent-child