有没有办法知道CreateProcessAsUser's进程何时退出c# ?

本文关键字:进程 何时 退出 CreateProcessAsUser 有没有 | 更新日期: 2023-09-27 18:15:04

我目前正在玩CreateProcessAsUser使用p/Invoke从c#,为了启动进程作为有限的用户从windows服务运行在SYSTEM帐户

我的目标是有一个服务,启动一个应用程序,需要从我们的办公室(前台运行的进程,时间空闲等)的用户获取信息。问题是,如果这个应用程序以用户的权限运行…好吧,他可以关闭它。如果像其他应用程序的常规进程一样运行,我可以使用以下命令控制此重生:

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = ExePath;
psi.UseShellExecute = false;
Process p = new Process();
p.StartInfo = psi;
p.EnableRaisingEvents = true;
p.Exited += new EventHandler(LaunchAgain);
p.Start();

但这样,我的问题是,我有两个应用程序,而不是一个无respawn-closable-by-user-app(好吧,但其中一个重生另一个:p)。

你知道是否有一些方法知道CreateProcessAsUser创建的进程可以被"监控",以便在它被杀死或终止时启动一些操作?

PD:当然,不要建议任何改进或不同的方法。

有没有办法知道CreateProcessAsUser's进程何时退出c# ?

两件事—CreateProcessAsUser有一个参数lpProcessInformation,用于接收有关新进程的数据。然后,您可以等待进程句柄。或者你可以通过process . getprocessbyid(…)创建一个c#进程类,并像在上面的代码片段中那样使用它。

噢,从你的服务中执行这个功能(收集信息——如果我理解正确的话)可能会更简单。

我终于解决了:

ProcessRunner runner = new ProcessRunner(Path, hSessionToken);
runner.Run();
this.Launch(context);

在我的ProcessRunner类中,我使用了如下内容:

CreateProcessAsUser(this.mSessionTokenHandle, this.mApplicationPath, this.CommandLine, IntPtr.Zero, IntPtr.Zero, 0, creationFlags, envBlock, this.WorkingDirectory, si, pi);
ProcessWaitHandle waitable = new ProcessWaitHandle(pi.hProcess);
if (waitable.WaitOne())
{
    return;
}  

因为WaitOne在获得信号时返回true。

这是我的类来摆弄等待句柄。

internal class ProcessWaitHandle : WaitHandle
{
    public ProcessWaitHandle(IntPtr processHandle)
    {
        this.SafeWaitHandle = new SafeWaitHandle(processHandle, false);
    }
}

感谢JeffRSon提出的使用句柄的想法。