2011-12-13 124 views
3

這需要一些解釋,但在這裏。多實例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或其他東西壓縮文件。

+0

您是否在使用FindRelatedProducts/RemoveExistingProducts時遇到問題,或者是否安裝了較新的版本,這些版本將作爲主要升級的一部分刪除之前的版本?當機器上有3個v1.0實例並且您嘗試安裝v2.0(主要升級)時,您希望發生什麼?更改所有組件代碼對我來說聽起來並不常見,但我大多數人都認爲它聽起來不像當前症狀的來源。 – 2011-12-17 15:54:34

+0

安裝新版本時,我允許通過引導程序選擇現有實例;我希望只有這個實例才能升級,因爲我將它傳遞給了MSIINSTANCEGUID。然而,我從那以後就知道FindRelatedProducts只查看UpgradeCode,直到現在我對所有實例都保持相同。我已經嘗試了小升級(通過用/ fvamus重新安裝,這很適合我),並且它可以工作到一定程度。其實你知道什麼,我會用所有這些新信息編輯問題。 – 2011-12-18 13:44:55

回答

0

這已經在這裏坐了很長一段時間,所以我想我會關閉它。我最終的方式是卸載以前的實例,然後進行正常安裝。似乎很好,所有的事情都考慮在內;完成工作。

0

難道你不能讓你的實例作爲功能嗎?然後,他們將在安裝過程中進行選擇,升級與他們一起工作良好。甚至有特殊的動作「MigrateFeatureStates」用於加載已經安裝的狀態。

至於拒絕清除的組件 - 可能需要明確指定persistent =「no」嗎?然後在卸載過程中必須將其移除。

+0

有趣的想法,但我覺得動態創建功能會有點太多的工作。至於沒有正確清除的組件,我的意思是,如果它們共享相同的GUID,即使它們不是相同的「對象」(對於非註冊表項等非文件組件),它們也會被視爲共享,所以沒有幫助不幸。 – 2011-12-23 08:19:20