【问题标题】:Is there any way of know when CreateProcessAsUser's processes exit from C#?有什么方法可以知道 CreateProcessAsUser 的进程何时从 C# 退出?
【发布时间】:2013-05-28 01:30:57
【问题描述】:

我目前正在使用 C# 中的 P/Invoke 使用 CreateProcessAsUser,以便从在 SYSTEM 帐户中运行的 Windows 服务作为受限用户启动进程。

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

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();

但是这样,我的问题是,我有两个用户可关闭的应用程序,而不是用户可关闭的应用程序(嗯,但其中一个会重新生成另一个:P) .

你知道有什么方法可以知道CreateProcessAsUser创建的进程是否可以被“监视”以在它被杀死或终止时启动一些操作?

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

【问题讨论】:

  • 为什么不能从服务中完成?
  • 因为从服务中,我必须使用 CreateProcessAsUser,这样我就无法控制进程何时退出以重新生成它。

标签: c# .net service createprocessasuser


【解决方案1】:

两件事 - CreateProcessAsUser 有一个参数lpProcessInformation 接收有关新进程的数据。然后,您可以等待进程句柄。或者您可以通过 Process.GetProcessById(...) 创建一个 C# 进程类,并像上面的 sn-p 一样使用它。

OTOH,直接从您的服务中执行功能(收集信息 - 如果我理解正确的话)可能会更简单。

【讨论】:

    【解决方案2】:

    我终于设法解决了:

    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 提出使用手柄的想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 2021-01-25
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      相关资源
      最近更新 更多