如何等待外部进程()为外部进程(服务)

如何等待外部进程()为外部进程(服务)

问题描述:

我正在创建一个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代替这个代码,但我希望这个当前的技术可以工作。

我在做一些工作,是否有我可以做的事情来避免异常并使用类似的代码?

+0

这是完全正常的。你必须务实,你不能改变Process类的工作方式。这当然需要从你的服务开始,很好地说再见,所以你不必找出困难的方式。当它从一次严重的撞车中死亡后仍然无法工作。但是一些特殊的事情发生了,它应该产生一个例外。 –

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

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

假设的作品,你可以用这个问题来让你的应用程序总是要求权限:How do I force my .NET application to run as administrator?