2009-09-25 124 views
4

我最近編寫了Windows服務並將其安裝在生產系統上。在一些應用Windows更新之後,服務器必須重新啓動,並且我的服務沒有正確加載,儘管它被設置爲自動啓動。在我們注意到客戶失敗後,該服務開始手動處理。經過一番調查後,我發現我錯過了爲服務添加服務依賴項。所以服務的引導順序在我們的案例中是錯誤的。收集Windows服務依賴關係

我可以解決這個問題,但我現在真的很關心如何收集所有必要的服務依賴關係的工具或過程。你知道任何可以處理這個問題的代碼嗎?

我欣賞任何提示。

+1

我也有這個完全相同的問題。現在我已經被束縛在安裝時將這些依賴關係添加到服務中,但我不知道它們可能是什麼...... – TheKingDave 2013-06-04 10:42:00

回答

3

工具如何知道哪些服務,你需要什麼?通過分析源代碼?通過運行您的服務,直到服務失敗?

使這項工作的唯一方法是知道您所依賴的服務,並在安裝服務時將它們添加到註冊表中。

我並不是說不可能自動執行此操作;但如果它可以自動化,那麼Windows就已經這樣做了:當連接到另一個服務時,Windows可以停止你的啓動,直到其他服務可用。

+0

分析源代碼將是一個選項。假設您使用'ManagementObjectSearcher',這是一個肯定使用WMI的類。因此添加依賴關係。也許這也可能基於程序集依賴關係,儘管這也會增加誤報。 – Scoregraphic 2009-09-25 08:06:09

+0

我仍然認爲,如果Windows在啓動服務時會自行判斷出來,它會更簡單。這不是火箭科學。 – 2009-09-25 12:06:03

+0

但我怎麼會知道,我的代碼需要哪些依賴關係?我是否需要依賴於DHCP才能從本地主機綁定/調用的WCF服務?我怎麼知道,從win7 home到win10 pro的客戶機器上有哪些「常規」服務? – 2017-10-08 08:59:41

2

服務及其依賴關係在註冊表中的HKLM/System/CurrentControlSet/Services/xxx下描述,其中xxx是服務的名稱。有數百個服務,並且只有其中一些在Services.msc控制檯中可見。在服務控制檯中,您可以調出服務的屬性窗口並查看依賴關係選項卡。將列舉依賴於服務以及服務所依賴的服務。在註冊表中,每個服務都有兩個名爲「DependOnService」和「DependOnGroup」的可選鍵。兩者都是REG_MULTI_SZ類型,這意味着它們可以包含多個值。查看這些值時使用RegEdt32.exe。這是定義依賴關係的地方。例如,如果要使服務依賴於Microsoft SQL Server,請在服務密鑰中添加一個名爲「DependOnService」的密鑰,其中包含「MSSQLSERVER」。通過查看服務屬性的Dependencies選項卡來驗證這一點。

如果要發現服務依賴關係,則需要以編程方式在註冊表中遍歷服務密鑰,並注意它們所依賴的服務和服務。一旦你完成了,你可以打印出結果。

當我想要發現.NET程序集之間的依賴關係時,我寫了類似於此的東西。

+0

感謝您的回答,但這不是我所期待的。我正在自己編寫服務,並想知道,我需要在那裏寫什麼依賴關係(或安裝程序需要編寫)。 – Scoregraphic 2009-09-25 08:29:19