這需要一些解釋,但在這裏。多實例MSI包升級失敗
我需要創建一個安裝動態實例的多實例MSI - 即在用戶安裝包時定義的實例,而不是在MSI文件中進行硬編碼。現在,我已經經歷了創建引導程序和使用MSI API動態創建轉換(MST)並將其應用於原始MSI的痛苦;經過多次修補,安裝和卸載工作正常(我會張貼細節,因爲他們需要)。
基本上,MST包含用於ProductCode,ProductName,PackageCode(在摘要信息中)的變換,更改所有組件的GUID(否則將以愚蠢的方式卸載失敗),並且引導程序保護安裝位置免受衝突。此外,引導程序將使用命令行參數MSINEWINSTANCE = 1開始安裝,詳見here。
但是,我還想升級已安裝的實例(通過主要升級),這是UpgradeCode獨特(或者我認爲)的主要原因。但是,在我增加MSI版本並嘗試啓動它(再次通過引導程序並通過MSIINSTANCEGUID屬性傳遞所需實例的ProductCode)後,它將失敗;日誌說:
=== Verbose logging started: 12/13/2011 17:43:56 Build type: SHIP UNICODE 5.00.7601.00 Calling process: C:\Windows\SysWOW64\msiexec.exe ===
MSI (c) (5C:D0) [17:43:56:120]: Font created. Charset: Req=0, Ret=0, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg
MSI (c) (5C:D0) [17:43:56:120]: Font created. Charset: Req=0, Ret=0, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg
MSI (c) (5C:34) [17:43:56:120]: Resetting cached policy values
MSI (c) (5C:34) [17:43:56:120]: Machine policy value 'Debug' is 2
MSI (c) (5C:34) [17:43:56:120]: ******* RunEngine:
******* Product: D:\TestArea\AMLDC.msi
******* Action:
******* CommandLine: **********
MSI (c) (5C:34) [17:43:56:120]: Machine policy value 'DisableUserInstalls' is 0
MSI (c) (5C:34) [17:43:56:135]: MainEngineThread is returning 1625
=== Verbose logging stopped: 12/13/2011 17:43:56 ===
和一個用戶界面消息彈出說'系統管理員已設置策略,以防止這種安裝'。顯然這不是真的(策略會出現在日誌中,並且會提供更明確的消息)。
1625錯誤代碼似乎對應於「ERROR_INSTALL_PACKAGE_REJECTED」。
任何想法,我可以嘗試未來?我想在這種情況下MSI引擎應該嘗試做什麼是檢查UpgradeCode,應用原始轉換(應該通過MSIINSTANCEGUID參數通過產品代碼緩存和可達)。然而很顯然,引擎永遠不會到達這個階段(它應該被記錄在日誌文件中,對吧?)
嘆了口氣,這已經比本應該更痛苦了。
編輯:一段時間後......不斷變化的組件GUID
快速注:這是對非文件組件(我有我用它來跟蹤實例的一些註冊表項)只有確有必要。如果我不更改它們的GUID,則它們在卸載時沒有被正確清理,詳情如下here。對於文件,如果關鍵路徑不同,它可以正常工作,而且我只通過更改我的代碼中的註冊表組件來驗證文件。
因此,我在此期間瞭解到,除非我爲每個實例更改UpgradeCode,否則主要升級可能不適用於我(因爲FindRelatedProducts僅查看UpgradeCode,我認爲),而且在嘗試其他方法之前那裏:小升級。
使用/ fvamus和MSIINSTANCEGUID = {existing-instance-product-code}一起啓動新版本的安裝程序似乎可以正常工作,直到我試圖向包中添加一個新文件(我期望將來會發生)...當然它不起作用(當然,新文件的組件不會在重新安裝時安裝)。
因此,我可能需要通過轉換來更改UpgradeCode,並查看含義,或者通過一些自定義操作來解決FindRelatedProducts的輸出屬性,並查看是否可以說服主要升級以這種方式工作。然而,最初的問題(1625錯誤)恰恰是主要的升級,所以不知道如果我不知道原因,我可以做些什麼。要完全清楚:我上面所粘貼的是MSI詳細日誌的整體,但在返回錯誤1625之前似乎沒有做任何事情。我也嘗試刪除MSI升級表中的所有行行爲沒有變化。
我也不能在這個愚蠢的問題上花費更多的時間,所以如果沒有其他工作,我會被迫做一個靜默卸載,然後用相同的設置進行常規安裝。我對這個想法感到畏懼,但如果它不能幫助...
編輯:公平地說,如果我沒有完全從MSI路徑開始並編寫我自己的安裝程序,它可能會更快從頭開始,使用gzipped流和簡單的xcopy。即使有一個msbuild任務可以從visual studio或其他東西壓縮文件。
您是否在使用FindRelatedProducts/RemoveExistingProducts時遇到問題,或者是否安裝了較新的版本,這些版本將作爲主要升級的一部分刪除之前的版本?當機器上有3個v1.0實例並且您嘗試安裝v2.0(主要升級)時,您希望發生什麼?更改所有組件代碼對我來說聽起來並不常見,但我大多數人都認爲它聽起來不像當前症狀的來源。 – 2011-12-17 15:54:34
安裝新版本時,我允許通過引導程序選擇現有實例;我希望只有這個實例才能升級,因爲我將它傳遞給了MSIINSTANCEGUID。然而,我從那以後就知道FindRelatedProducts只查看UpgradeCode,直到現在我對所有實例都保持相同。我已經嘗試了小升級(通過用/ fvamus重新安裝,這很適合我),並且它可以工作到一定程度。其實你知道什麼,我會用所有這些新信息編輯問題。 – 2011-12-18 13:44:55