2016-11-12 138 views
0

我正在創建一個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類的工作方式。這當然需要從你的服務開始,很好地說再見,所以你不必找出困難的方式。當它從一次嚴重的撞車中死亡後仍然無法工作。但是一些特殊的事情發生了,它應該產生一個例外。 –

回答

0

很可能您的服務以不同的用戶身份運行(可能是LocalSystem)。您的應用程序很可能以您當前的用戶身份運行,而不是以管理員身份運行。

非管理員進程不允許查詢其他用戶進程的某些方面。您可以嘗試以管理員身份運行應用程序,以驗證這是您的問題:嘗試右鍵單擊可執行文件並選擇「以管理員身份運行」,這會提示用戶訪問控制對話框,然後應該沒有問題地工作。

假設的作品,你可以用這個問題來讓你的應用程序總是要求權限:How do I force my .NET application to run as administrator?