如何 运行 具有 ShellExecuteEx 的进程作为 child 在 parent 退出后关闭?

How to run a process with ShellExecuteEx as as a child that closes after parent exit?

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

不幸的是,我无法 运行 将进程作为 真实 child。新进程 运行 作为一个单独的进程并继续 运行 即使在生成器关闭后也是如此。但是我需要它在 parent 退出时自动关闭(正常退出或崩溃或任何其他原因)。

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

您可以使用 shell 动词 runas 强制提升。这排除了 CreateProcess。所以你可以这样做:

  1. 使用ShellExecuteEx创建子进程。
  2. 为子进程安排 ShellExecuteEx 到 return 进程句柄。
  3. 当父终止时,终止子。

如果您想使用作业将进程绑定在一起,那么您需要包含子进程的 requiresAdministrator 清单选项。这样你就可以使用 CreateProcess 并根据需要指定进程创建标志。

现在,您可能不希望以这种方式显示子进程。如果是这样,那么您仍然可以通过调用 CreateProcess 来完成工作。您需要三个进程:

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

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