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

时间:2016-11-12 01:31:22

标签: c# remoting

我正在创建一个与其他应用程序携手合作的Windows服务。这些应用程序开始与VIA Remoting服务进行通信。一旦建立连接,我希望应用程序在服务停止时立即停止通信。意思是我不想等待Timer过去或有异常,因为通信试图使用不再有效的IpcConnection。

当服务以交互方式而不是服务方式运行时,这一切都有效。当它作为服务运行时,我得到一个例外。无论是作为服务运行还是以交互方式运行,该服务都以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替换此代码,但我希望这种技术可行。

我做了什么工作,我能做些什么来避免异常并使用类似的代码?

1 个答案:

答案 0 :(得分:1)

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

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

假设有效,您可以使用此问题使您的应用始终需要该权限:How do I force my .NET application to run as administrator?