如何 运行 具有 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
。所以你可以这样做:
- 使用
ShellExecuteEx
创建子进程。
- 为子进程安排
ShellExecuteEx
到 return 进程句柄。
- 当父终止时,终止子。
如果您想使用作业将进程绑定在一起,那么您需要包含子进程的 requiresAdministrator
清单选项。这样你就可以使用 CreateProcess
并根据需要指定进程创建标志。
现在,您可能不希望以这种方式显示子进程。如果是这样,那么您仍然可以通过调用 CreateProcess
来完成工作。您需要三个进程:
- 父进程,以标准用户身份运行。
- 启动器进程,显示为已提升。由父级创建,具有适当的作业标志,并传递指定如何启动子级的参数。它与
CreateProcess
一起执行并放置在同一份工作中。
- 子进程。没有表现出升高。但是因为它是由提升的发射器发射的,所以它也是提升的。
这里的要点是有两种方法可以强制提升。在编译时静态地使用清单。这允许您使用 CreateProcess
。或者动态地使用 runas
shell 动词。这迫使 ShellExecuteEx
。您声明您被推送到 CreateProcess
,这意味着使用清单强制提升。
我需要生成一个需要调用 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
。所以你可以这样做:
- 使用
ShellExecuteEx
创建子进程。 - 为子进程安排
ShellExecuteEx
到 return 进程句柄。 - 当父终止时,终止子。
如果您想使用作业将进程绑定在一起,那么您需要包含子进程的 requiresAdministrator
清单选项。这样你就可以使用 CreateProcess
并根据需要指定进程创建标志。
现在,您可能不希望以这种方式显示子进程。如果是这样,那么您仍然可以通过调用 CreateProcess
来完成工作。您需要三个进程:
- 父进程,以标准用户身份运行。
- 启动器进程,显示为已提升。由父级创建,具有适当的作业标志,并传递指定如何启动子级的参数。它与
CreateProcess
一起执行并放置在同一份工作中。 - 子进程。没有表现出升高。但是因为它是由提升的发射器发射的,所以它也是提升的。
这里的要点是有两种方法可以强制提升。在编译时静态地使用清单。这允许您使用 CreateProcess
。或者动态地使用 runas
shell 动词。这迫使 ShellExecuteEx
。您声明您被推送到 CreateProcess
,这意味着使用清单强制提升。