2013-10-24 35 views
1

好吧,我知道如何使用WiX來部署服務,但我試圖解決以下困境。我想在主要升級時保留服務配置(例如登錄憑證等)(以便用戶不必重新定義服務設置)。爲此,InstallExecuteSequence裏面,我用:WiX 3.7:安裝Windows服務以正常升級和無縫卸載的正確方法是什麼?

<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices> 

我有的ServiceControl停止屬性設置爲。但是,當我卸載應用時,如果服務正在運行,會發生以下警告:

「安裝程序必須更新在系統運行時無法更新的文件或服務如果您選擇繼續,重新啓動將需要完成設置。「

如果我選擇繼續並且不重新啓動,服務和所有應用程序文件都會被刪除,所以此消息看起來完全是虛假的。如果我在運行卸載程序之前手動停止服務,則不會顯示警告。

我做錯了什麼?我需要做些什麼來避免此警告,同時確保在主要升級時服務不會被刪除(並重新創建)?

回答

0

好,很好的問題, 按我的理解,問題是,服務不停止,你照顧DeleteServices的,這似乎是奇後,由於執行順序的順序是:

* StopServices 
• DeleteServices 
• RemoveFiles 
• InstallFiles 
• InstallServices 
• StartServices 

我想試試這個:

<DeleteServices After="StopServices" Before="RemoveFiles">NOT UPGRADINGPRODUCTCODE</DeleteServices> 
<InstallServices>NOT UPGRADINGPRODUCTCODE</InstallServices> 

但對於實際的問題,這似乎有點腥,而且我還能做什麼,是創造一切必要的註冊表鍵/值保持有關注冊表的信息,而不是要求它再次用於升級產品。然後,您可以稍後再將這些信息傳遞給服務,而不必混淆您的設置(這對於屬性,組件條件和registrySearch來說非常簡單)。

如果您想在升級時添加新服務,該怎麼辦? Ps,您可以創建新用戶,爲他分配安裝權限,並使用該用戶登錄以進行服務。我知道還有更多要記住,但沒有太複雜。

+0

嗯......DeleteServices元素似乎沒有After或Before屬性。唯一支持的屬性是Sequence和Suppress。我檢查了Orca中的MSI文件,並且StopServices操作的序列號爲1900,而DeleteServices和RemoveFiles分別爲2000和3600,因此從序列角度看它們都很好。 –

0

一種技術是使用remember property pattern的修改版本。你想添加一些加密。

問題是MSI被設計爲自己定義的配置。如果配置改變,其中一個必須贏。 MSI爲文本/配置文件處理這個問題(用戶數據通過創建日期和修改日期比較進行保存),但對於像服務這樣的服務則沒有檢查。

現在,如果有人更改服務憑證,記憶屬性將被使用,並且會被更改回來。

一個棘手的問題,有時沒有真正的解決方案。一種方法是始終安裝爲NetworkService或SYSTEM,並將應用程序的設計更改爲與這些憑據和配置文件一致。 (簡化問題。)

+0

沒錯,但有些情況下SYSTEM或其他內置帳戶不起作用(例如,當服務需要使用用戶存儲的DPAPI加密或訪問Active Directory或使用集成連接到數據庫服務器或Web服務時Windows身份驗證等)。 –

+0

爲了存儲敏感數據(比如賬戶密碼),進入記憶屬性模式位置會引發比我首先要解決的問題更嚴重的問題(例如,您如何對其進行加密?您在哪裏存儲加密密鑰?如何保護加密密鑰?如果帳戶更改的密碼和用戶更新了服務控制面板中的登錄信息,該怎麼辦?但是這些信息不會被MSI知道?等等)。 –

+0

NetWorkService使用AD計算機帳戶,您可以將該對象訪問權授予其他網絡資源。 Windows安裝程序缺乏這方面的內容,所以你必須弄清楚什麼。只是不採取標準措施並不能解決問題。 –