2012-09-17 130 views
1

期間有條件地啓動服務我有一個MSI安裝程序來安裝服務,默認情況下它會停止。用戶可以手動打開它或停止它。我也有一個MSI補丁。Wix在補丁

問題:安裝補丁程序時,服務停止。如果它打開,我希望修補程序離開服務,如果它是關閉,則會關閉。我怎樣才能達到這種功能?

回答

0

所以最後我使用了兩個自定義操作。一個在安裝補丁程序之前保存服務的狀態。如果服務是STOPPED,我使用MYSERVICE_STATUS等屬性將它們設置爲「0」,如果它們是RUNNING,則將其設置爲「1」。

修補程序安裝完成後,我啓動另一個自定義操作來檢查這些屬性和每個服務的最終狀態。如果MYSERVICE_STATUS == 1和服務現在是STOPPED他們,我重新啓動它。

2

據我瞭解補丁工作方式,這是預期的默認行爲。

請注意,當您第一次安裝MSI軟件包(初始安裝)時,服務將被安裝爲停止狀態,並且MSI軟件包將緩存在系統中的特殊位置。安裝補丁程序時,修補程序爲安裝程序包帶來的更改將應用​​於緩存的MSI,從而將其轉換爲期望的方式,並重新安裝程序包。因此,只要初始軟件包包含將服務安裝爲停止的說明,並且修補程序更改不會修改此內容,則將重新安裝該組件並且服務最終停止 - 就像初次安裝後一樣。

爲了改變這種行爲,你可以嘗試標記包含服務的組件爲NeverOverwrite。如果您爲某個組件設置了NeverOverwrite='yes',則在修補程序應用程序期間不會重新安裝該組件,因此現有服務將保持獨立狀態,並且保持應用修補程序之前的狀態。

我不確定是否需要在初始安裝包中更改組件描述的方式。希望,改變它在新的一個將工作。否則,如果您已經提供了產品的初始版本,則可能會造成問題。

我應該警告你,我沒有嘗試這種確切的情況,所以你可能想先驗證這個建議。

+0

感謝您的回答。不幸的是,MSI是在一段時間之前發佈的,現在我正在開發這個補丁。所以我不能嘗試使用「NeverOverwrite」屬性。我不能通過重新定義修補程序中的元素來實現此目的嗎?我想我也可以通過自定義操作完成,但這是最後的手段。 – Herno

+0

您是否嘗試過'NeverOverwrite'屬性的方法?正如我在答覆中提到的那樣,我不確定它會起作用,但你一定要嘗試一下。只要補丁首次應用於視圖,只有產品重新安裝發生,纔有可能重新安裝,以便知道'NeverOverwrite' ... –

+0

我剛剛嘗試過,看起來它沒有奏效。我已經看到ServiceControl表有一個名爲「StopXXXXService」的條目。也許我可以使修補程序轉換表並刪除此條目?有沒有辦法?謝謝 – Herno