我需要生成一个需要调用UAC的进程。我看过这篇文章:How can I run a child process that requires elevation and wait?。
不幸的是,我无法以真正的孩子的身份运行流程。新进程单独运行,即使在生成器关闭后仍继续运行。但我需要它在父母退出时自动关闭(正常退出或崩溃或任何其他原因)。
提供的解决方案之一是为此使用作业。不幸的是,我无法将使用ShellExecuteEx
创建的流程分配给作业。它返回错误ERROR_ACCESS_DENIED
。为了解决这个问题,我必须将CREATE_BREAKAWAY_FROM_JOB
传递给CreateProcess
。这就是封闭的圈子。我必须使用ShellExecuteEx
而不是CreateProcess
。
答案 0 :(得分:3)
您可以使用shell动词runas
来强制提升。哪个排除了CreateProcess
。所以你可以做到以下几点:
ShellExecuteEx
创建子进程。 ShellExecuteEx
返回孩子的流程句柄。 如果您想使用作业将流程绑定在一起,那么您需要包含子项的requiresAdministrator
清单选项。这样您就可以使用CreateProcess
并根据需要指定进程创建标志。
现在,您可能希望不要让子进程表现出来。如果是这样,那么您仍然可以通过拨打CreateProcess
来完成工作。您需要三个流程:
CreateProcess
的关系,并放在同一个工作中。 这里的要点是强制提升有两种方法。静态编译时使用清单。这允许您使用CreateProcess
。或动态使用runas
shell动词。这迫使ShellExecuteEx
。您声明您被推到CreateProcess
,这意味着使用清单来强制提升。