2009-02-16 15 views
5

當我登錄我與威瑞信signtool.exe服務的組件,它失敗當機器啓動時,運行Windows 2003 Server的計算機上啓動。事件日誌有兩個事件:簽名程序阻止我的服務啓動

「超時(30000毫秒)等待XXX Service服務進行連接。」 和 「中的xxx服務服務啓動失敗由於以下錯誤: 該服務沒有及時啓動或控制請求。」

一旦機器運行就可以正常啓動。它在XP和Vista中開始很好。當程序集未簽名時它可以正常啓動。

回答

2

Authenticode簽署您的程序集可能會對冷啓動產生負面影響。有關詳細信息,請參閱此KB文章

http://support.microsoft.com/default.aspx/kb/936707

+0

雖然安裝補丁,其中MS表示,它不測試不很動聽的生產系統... – 2009-02-16 22:25:57

1

正如Spacedog的說,驗證碼可以在啓動時壞的影響。所以問題是你在簽署什麼? Authenticode僅對您的服務可執行文件進行簽名就足夠了,而該服務可執行文件又只能引用強命名的程序集。因此驗證Authenticode簽名的開銷。

您可以將程序集安裝到GAC - 如果可能的話 - 這會略微提升啓動性能,因爲強名稱驗證會被忽略(請參閱Authenticode and Assemblies),或者如果啓動時間仍然是問題,您也可以啓動程序集。

從答案Windows service startup timeout由羅慕洛A. Ceccon:

It's good practice to finish starting your service as fast as possible. So, during the start state, do only what you absolutely need to acknowledge it started successfully; and do the rest later. If the start is still a lengthy process, use SetServiceStatus periodically to inform the Service Control Manager that you have not yet finished, so it does not time-out your service.

除了SetServiceStatus你也可以嘗試告訴服務控制管理器(SCM),該服務需要額外的時間來啓動致電ServiceBase.RequestAdditionalTime

+0

這個答案似乎混爲一談驗證碼簽名與強名稱簽名? – Dave 2009-02-16 22:05:36

4

這個問題對於簽署.NET服務的可執行文件非常普遍:該服務將無法在開機時啓動,但隨後以手動方式啓動時運行正常。是否使用ServiceBase.RequestAdditionalTime無關緊要:事實上,在服務啓動請求超時之前,根本沒有用戶代碼被執行。在沒有互聯網連接的機器上,這種效果更加明顯:在這種情況下,即使從SCM手動啓動服務也會失敗。

要解決此問題,disable the verification of the Authenticode signature at load time in order to create Publisher evidence,通過添加以下內容到你的.exe.config文件與:

<configuration> 
    <runtime> 
     <generatePublisherEvidence enabled="false"/> 
    </runtime> 
</configuration> 

出版商的證據是一個很少使用的代碼訪問安全(CAS)功能:只有當您的服務依賴PublisherMembershipCondition將禁用它導致問題。在所有其他情況下,它將使永久或間歇啓動失敗消失,不再需要運行時執行昂貴的證書檢查(包括撤銷列表查找)。

編輯,2010年7月:對於使用.NET Framework 4.0版的應用程序,不再需要此解決方法。