2010-10-26 31 views
8

我構建了一個作爲Windows服務運行並通過我的代碼安裝的應用程序。確保Windows服務在登錄之前運行

除了登錄以外,一切正常。

當在第一個Windows XP/2003服務器登錄屏幕上,我不確定服務是否運行。如果是這樣,那麼它確實工作,因爲它不起作用(該服務正在使用WINPCAP,因此可能是一個問題)。

服務設置被設置爲「與桌面交互」並以SYSTEM身份運行。

如何確保服務在Windows登錄之前啓動?另外,即使在註銷後,我如何確保它仍在運行?

回答

3

有幾個問題需要考慮。

  1. 首先,您可以通過將事件記錄到Windows事件日誌來檢查您的服務是否確實在登錄之前和註銷之後運行。幾乎所有的服務都會在開始和停止時執行此操作,而您的操作也應該如此。

  2. 可能是WinPcap是問題的一部分。在服務中使用WinPcap有幾條黃金法則。您的服務不得做任何可能導致WinPcap服務嘗試在自己的服務啓動時啓動的任何操作,因爲這會導致Windows服務控制管理器出現死鎖。這意味着,如果WinPcap服務在您的服務開始啓動時不是已經是SERVICE_RUNNING,那麼在服務爲SERVICE_RUNNING之前,您不得做任何可能導致它啓動的事情。

    有兩種方法可以確保這一點。要麼使您的服務依賴於npf網絡數據包篩選器服務。或者在您的服務是SERVICE_RUNNING之前不要調用任何WinPcap函數。我沒有嘗試過後一種方法。我認爲WinPcap函數會阻塞,直到npf爲SERVICE_RUNNING。如果您的服務依賴於npf,那麼您還必須使其依賴nm(網絡監視器驅動程序) - 當且僅當在系統上安裝了nm時。 nm爲WinPcap提供了PPP/VPN支持,如果安裝了WinPcap,它總是會嘗試使用它。顯然,如果你讓nm成爲你的服務的依賴,而nm沒有安裝,那麼你的服務將無法啓動。

  3. 我不認爲有保證的方式來確保您的服務在桌面出現之前啓動。但是您可以通過創建一個服務控制組,將其添加到現有服務控制組列表的末尾,然後將您的服務放入該組中,從而幫助解決問題。我並不完全相信,這是一種「已批准」的方式,可以讓您的服務儘快啓動,因爲如果採用了已批准的方式,那麼每個人都會這樣做,而且不會再有任何工作。但有人建議,一個組中的服務在服務不在一個組中之前開始。

    查看HKEY_LOCAL_MACHINE,「SYSTEM \ CurrentControlSet \ Control \ GroupOrderList」和HKEY_LOCAL_MACHINE,「SYSTEM \ CurrentControlSet \ Control \ ServiceGroupOrder」並做一些Google搜索。

相關問題