如何为外部进程(服务)WaitForExit()



我正在创建一个与其他应用程序协同工作的Windows服务。这些应用程序通过Remoting开始与服务通信。一旦建立了连接,我希望应用程序在服务停止时立即停止通信。这意味着我不想等待计时器的失效或有一个异常,因为通信试图使用不再有效的IpcConnection。

当服务以交互方式运行而不是作为服务运行时,这一切都有效。当它作为服务运行时,我会得到一个异常。服务作为Admin运行,无论它是作为服务运行还是交互式运行。如果我以Admin身份运行另一个应用程序,那么它就会像预期的那样工作。不幸的是,在生产环境中不能以Admin身份运行这个应用程序。

我已经把范围缩小到导致异常的原因。

var serverProc = Process.GetProcessById(_remote.ProcessId);
serverProc.WaitForExit();

serverProc成功,但WaitForExit失败。

System.ComponentModel.Win32Exception (0x80004005): Access is denied
   at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
   at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
   at System.Diagnostics.Process.WaitForExit(Int32 milliseconds)

我可以用Timer替换此代码,但我希望当前的技术可以工作。

我正在做一些工作,我可以做些什么来避免异常和使用类似的代码?

您的服务很可能作为不同的用户(可能是LocalSystem)运行。您的应用程序很可能以当前用户而不是管理员的身份运行。

非管理员进程不允许其他用户查询进程的某些方面。你可以尝试以管理员身份运行你的应用程序来验证这是你的问题:尝试右键单击你的可执行文件并选择"以管理员身份运行",这将提示用户访问控制对话框,然后应该没有问题。

假设工作,您可以使用这个问题使您的应用程序始终需要该权限:我如何强制我的。net应用程序以管理员身份运行?

最新更新