繁体   English   中英

如何将以ShellExecuteEx作为子进程运行的进程在父退出后关闭?

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

我需要产生一个需要调用UAC的进程。 我已经阅读了这篇文章: 如何运行需要提升并等待的子进程?

不幸的是,我不能像一个真正的孩子那样运行流程。 新进程将作为单独的进程运行,即使在生成器关闭后仍继续运行。 但是我需要它在父母退出时自动关闭(正常退出或由于崩溃或任何其他原因)。

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

您可以使用外壳动词runas强制提升。 哪个排除CreateProcess 因此,您可以执行以下操作:

  1. 使用ShellExecuteEx创建子进程。
  2. 安排ShellExecuteEx返回该子项的进程句柄。
  3. 父母终止时,终止孩子。

如果要使用作业将流程的生命联系在一起,则需要包括子项的requiresAdministrator清单选项。 这样,您可以使用CreateProcess并根据需要指定进程创建标志。

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

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

这里的要点是有两种方法可以强制抬高。 带有清单的静态编译时。 这样就可以使用CreateProcess 或与runas shell动词一起动态使用。 这迫使ShellExecuteEx 您声明已被推送到CreateProcess ,因此这意味着使用清单来强制提升。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM