如何使用ShellExecuteEx作为在父出口后关闭的子进程运行进程?

时间:2015-06-30 15:50:03

标签: c++ winapi uac shellexecute

我需要生成一个需要调用UAC的进程。我看过这篇文章:How can I run a child process that requires elevation and wait?

不幸的是,我无法以真正的孩子的身份运行流程。新进程单独运行,即使在生成器关闭后仍继续运行。但我需要它在父母退出时自动关闭(正常退出或崩溃或任何其他原因)。

提供的解决方案之一是为此使用作业。不幸的是,我无法将使用ShellExecuteEx创建的流程分配给作业。它返回错误ERROR_ACCESS_DENIED。为了解决这个问题,我必须将CREATE_BREAKAWAY_FROM_JOB传递给CreateProcess。这就是封闭的圈子。我必须使用ShellExecuteEx而不是CreateProcess

1 个答案:

答案 0 :(得分:3)

您可以使用shell动词runas来强制提升。哪个排除了CreateProcess。所以你可以做到以下几点:

  1. 使用ShellExecuteEx创建子进程。
  2. 安排ShellExecuteEx返回孩子的流程句柄。
  3. 当父母终止时,终止孩子。
  4. 如果您想使用作业将流程绑定在一起,那么您需要包含子项的requiresAdministrator清单选项。这样您就可以使用CreateProcess并根据需要指定进程创建标志。

    现在,您可能希望不要让子进程表现出来。如果是这样,那么您仍然可以通过拨打CreateProcess来完成工作。您需要三个流程:

    • 父进程,以标准用户身份运行。
    • 发射器过程,表现为升高。由父级创建,具有适当的作业标志,并传递指定如何启动子级的参数。它与CreateProcess的关系,并放在同一个工作中。
    • 子进程。没有表现出提升。但是因为它是由高架发射器发射的,它也是升高的。

    这里的要点是强制提升有两种方法。静态编译时使用清单。这允许您使用CreateProcess。或动态使用runas shell动词。这迫使ShellExecuteEx。您声明您被推到CreateProcess,这意味着使用清单来强制提升。