0

我有一個跨多個站點安裝的產品。現在我們發佈了升級。但問題是,在第一個版本中,安裝是針對每個用戶的,現在我們已經針對每臺機器進行安裝。在檢測到舊安裝(v2)時運行的新版本(v3)中存在自定義操作。但是,當msi以安裝版本2的其他用戶身份運行時,它不會被檢測爲已安裝。是否有方法檢測舊版本是否已安裝(即使它是由不同於當前用戶的用戶安裝的 ),可能在安裝腳本。如何檢查應用程序是否安裝(對於任何用戶),並使之升級而不是安裝?

+0

有沒有把你放在了一些神器任何共享的地方(可以是文件或註冊表項),還是您依賴安裝程序本身設置的密鑰?另外,請明確每個版本是否爲InstallScript或InstallScript MSI安裝程序。 –

+0

我可以調整安裝程序,以便msi檢測到舊版本已安裝並作爲更新運行 – wintersolider

回答

1

檢查兩個註冊表64/32已安裝的應用程序。在這些鍵下查找您的產品GUID。如果它在那裏,它已安裝。

這適用於微星安裝的東西。

32位: [HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微軟\的Windows \ CurrentVersion \卸載]

64位: [HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows \ CurrentVersion \卸載]

+0

在安裝腳本中,我可以讀取此值。但是有沒有什麼辦法讓msi自動作爲升級版運行,即使對於其他用戶也檢測舊版本 – wintersolider

+0

您必須配置MSI安裝程序以正確更新。這需要在InstallShield IDE左側樹的Media-> Upgrades節點中編寫。您可以指定要升級的版本。 –

0

既然你不不知道機器上可能有多少用戶,以及按照每臺機器或每個用戶安裝產品的人數,我認爲唯一透徹的方法是使用MsiGetProductInfoEx()或同等產品來爲所有用戶機。例如,我不知道您的具體情況,但是如果管理員代表安裝每臺計算機的新產品,那麼除非您找到實際安裝它的用戶,否則您將陷入困境。這不是一個好用的用戶管理員安裝!您需要枚舉所有用戶,獲取每個SID並詢問是否安裝了您的產品,並使用該API(或同等產品)。如果找到,您會告訴用戶以該用戶身份登錄並卸載該產品。 IIRC當另一個用戶(甚至管理員)試圖卸載其他用戶安裝的每個用戶產品時,它並不總是成功。

根據我的經驗,在大多數情況下,人們嘗試使用某種獨立於安裝上下文的檢測方法來檢測產品是否已安裝。然後,如果您的每臺計算機主要升級沒有設置說明它發現每臺機器安裝的屬性,只會引發錯誤並要求手動卸載。

注:添加自定義操作和二手:: MsiConfigureProduct()卸載和MsiGetProductInfoEx()檢查產品安裝

+0

通過調查這樣的許多其他問題 http://stackoverflow.com/questions/15652821/how-to-change-from-per-user-to-all-user-installation 我開始知道,有這樣的沒有辦法使這作爲升級工作,所以我不得不去與手動覆蓋。 – wintersolider

+0

我做了一個編輯可以解釋一些關於使用API​​來實現我的場景,即卸載舊版本(如果已經爲任何用戶安裝),然後繼續正常安裝 – wintersolider

相關問題