2015-06-30 189 views
1

我需要产生一个需要调用UAC的进程。我看过这篇文章:How can I run a child process that requires elevation and wait?如何使用ShellExecuteEx作为父级退出后关闭的子级运行进程?

不幸的是我不能运行一个进程real孩子。新过程作为单独运行并且在产卵器关闭后继续运行。但是当父母退出时(正常退出或崩溃或其他原因),我需要它自动关闭。

提供的解决方案之一是使用作业。不幸的是,我不能将一个用ShellExecuteEx创建的进程分配给一份工作。它返回给我一个错误ERROR_ACCESS_DENIED。为了解决这个问题,我必须通过CREATE_BREAKAWAY_FROM_JOBCreateProcess。这是封闭的圈子。我必须使用ShellExecuteEx而不是CreateProcess

+3

Windows内核不会将任何特定的含义赋予*子进程*,但不包括句柄继承。特别是在过程寿命方面没有关系(除非明确实施)。 – IInspectable

+0

Windows并不关心进程之间的父/子关系。进程是彼此独立的。是的,它可以*知道哪个进程产生了另一个进程(Windows会在后台跟踪该信息),但它对于Windows环境中的用户代码并不是真正有用的信息。作为一个孩子运行一个流程,你究竟想要解决什么问题?只是产生一个新的过程,并完成它。MK链接的问题告诉你如何将过程链接在一起,如果你必须能够一起杀死它们 - 将它们放在同一个Job对象中。 –

+0

如果您不希望父进程等待“孩子”,请不要。等待启动的进程退出不是默认状态。 –

回答

2

您可以使用shell动词runas强制抬高。其中排除CreateProcess。因此,您可以执行以下操作:

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

如果您想使用作业将流程生命结合在一起,那么您需要包含儿童的requiresAdministrator清单选项。这样,您可以使用CreateProcess并根据需要指定进程创建标志。

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

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

这里的要点是有两种方法来强制抬高。静态地在编译时使用清单。这可以让你使用CreateProcess。或动态使用runas shell动词。这迫使ShellExecuteEx。你声明你被推到CreateProcess,所以这意味着使用清单强制抬高。

+0

谢谢。只是为了澄清第二部分 - 有三个过程 - 启动过程是中间过程,不应该放在工作中。但我必须在父进程中创建一个工作,将其传递给启动进程,启动程序会在产卵后将子进程放入此工作中,对吗? – nikitablack

+0

你可以这样做。或者你可以在工作中拥有全部三个流程。我不确定这很重要。我不认为让他们都在同一份工作中有任何不利之处。 –

+1

那么,如果父母是正常的过程,并且孩子升高,那么将其置于工作中总是失败。 – nikitablack

相关问题