我目前正在使用来自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:当然,不要提出任何改进或不同的方法。答案 0 :(得分:1)
两件事 - CreateProcessAsUser有一个参数lpProcessInformation
,它接收有关新进程的数据。然后,您可以等待进程句柄。或者您可以通过Process.GetProcessById(...)创建一个C#流程类,并像上面的代码片段一样使用它。
OTOH,从你的服务中做功能(收集信息 - 如果我理解的话)可能更简单。
答案 1 :(得分:1)
我终于设法解决了它:
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使用句柄的想法。