gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:31 25 4
gpt4 key购买 nike

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

不幸的是,我不能作为一个真正的 child 来运行一个进程。新进程作为一个单独的进程运行,甚至在 spawner 关闭后继续运行。但我需要它在 parent 退出时自动关闭(正常退出或崩溃或任何其他原因)。

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

最佳答案

您可以使用 shell 动词 runas 强制提升。这排除了 CreateProcess。因此,您可以执行以下操作:

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

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

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

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

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

关于c++ - 如何使用 ShellExecuteEx 作为在父退出后关闭的子进程运行进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31142896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com