2010-08-18 178 views
11

我已經爲一個內部項目開發了一個Wix安裝程序,但完全意外我發現我無法卸載我的開發機器上的安裝程序,因爲我收到以下錯誤消息:Wix/MSI:無法卸載

您要使用的功能是對不可用

一個對話框指向我從功能從安裝的.msi的路徑的網絡資源。 (.msi在那裏,但是已經被重建並且自從我安裝以來已經改變了)

我很擔心這個對話框,因爲我相信Windows安裝程序會跟蹤已安裝的.MSI文件,但是這個對話框似乎表明我可以通過刪除,移動或更改安裝程序來打破卸載程序。

這是這種情況?

我需要做些什麼來確保我不以這種方式破壞我的卸載程序? (我們是否需要保留安裝在機器上的所有版本的副本?)

回答

9

編寫安裝程序的第一個痛苦教訓是從不在您自己的機器上運行安裝。當然,直到它達到一個成熟的點,並經歷了幾個QA週期。這就是我們的集成實驗室和虛擬機。 (有一種說法,你不應該在自己的後院做什麼。)

這就是說,通常MSI卸載不需要MSI,但有些情況下可能需要它。例如,如果有人在卸載過程中調用ResolveSource操作,則MSI會查找.MSI。

現在有幾種方式出這個鹹菜:

  1. 採取的MSI你必須與ORCA編輯它以匹配文件名,的UpgradeCode,產品代碼和您安裝的MSI的PackageCode。您應該能夠從查看存在於%WINDIR%\Installer中的已刪除緩存MSI中獲取所有這些信息。 CD到該目錄並執行findstr -i -m SOMESTRING *.msi,其中SOMESTRING是獨一無二的,比如您的ProductName屬性。一旦知道緩存的MSI的名稱,在Orca中打開它以獲取所需的屬性。然後將這些屬性放在您可用的MSI副本中,並嘗試進行卸載。不,這不是你安裝的確切的MSI,但通常它足夠接近。

  • 使用前端WindowsInstaller清理實用工具(如果仍然有它)和/或後端MSIZAP效用擦拭應用程序的所有知識從MSI和Add/RemovePrograms。請注意,這實際上並未卸載程序,因此您還必須編寫腳本或以其他方式手動卸載程序的所有痕跡。
  • 重新映像工作站
  • +0

    我的問題是 - 我如何阻止生產機器發生這種情況,我知道如何修理我的機器! :-) – Justin 2010-08-19 01:37:44

    +1

    「我們是否需要保留機器上安裝的所有版本的安裝程序的副本?」 恩,是的。你不是已經保存了所有投入生產的副本嗎?我知道我們有一個配置管理系統,可以確保我們在任何地方和任何地點交付。 如果你的問題是爲什麼會發生這種情況,而不是如何擺脫它,然後記錄卸載,看看它爲什麼要求MSI。 – 2010-08-19 02:45:17

    10

    擺脫這種局面的最簡單的方法是做一個重新緩存/重新安裝。構建一個沒有「破碎」的MSI的新版本(不管它被破壞了,在這種情況下,它可能根本不會被破壞,你只需要一個新的源代碼)。然後你使用如下命令行:

    msiexec /fv path\to\your.msi /l*v i.txt 
    

    這會將your.msi複製到緩存的MSI上並進行修復。那麼你會在一個更好的地方。

    +0

    我的問題是 - 我如何阻止這種情況發生在生產機器上,(或者我的MSI如何「損壞」)我知道如何修理我的機器! :-) – Justin 2010-08-19 01:38:22

    +0

    查看詳細的日誌文件,找出爲什麼需要原始源文件。您可能在MSI的某個地方出現了一個錯誤,它迫使它在卸載過程中需要原始源代碼。直到你解決這個問題,你需要有MSI可用......這是非常煩人的。 :) – 2010-08-19 19:59:01

    1

    如果您確切地知道什麼是錯誤的(在開發過程中經常出現這種情況),我更願意打開Windows將用於卸載的MSI文件,並使用Orca等工具直接編輯它以修復或刪除部分導致失敗。

    例如:

    • 定位%WINDIR%\安裝MSI文件。在卸載失敗後,MSI應該是該文件夾中最後編輯的MSI文件。
    • 用Orca打開msi文件。
    • 刪除失敗的部分 - 例如失敗的InstallExecuteSequence操作,這是非典型場景。
    • 保存msi並關閉Orca以釋放msi文件上的鎖定。
    0

    - 你在安裝過程中使用 「從源代碼運行」 實驗?

    這是功能樹中的一個選項,它允許您從其安裝源運行某些文件。這通常與網絡上的管理圖像相結合。見下圖。我還沒有嘗試過,但我認爲這可能會導致:「如果網絡關閉並且您試圖卸載,您嘗試使用的功能位於不可用的網絡資源」。只是一個理論,還有其他的方式可能發生。

    enter image description here

    2 -你運行腳本自定義操作?如果是這樣,你解壓到tmp文件夾還是從安裝的文件或二進制表運行?如果是這樣,自定義操作是否僅限於安裝時運行?

    3 -您是否正在運行一個EXE自定義操作指向已安裝的文件?如果是這樣的話,這個文件可能在網絡上無法訪問。

    4 -是否有任何用戶配置文件夾將重定向到網絡共享?

    5 -你的網絡直接安裝任何東西到文件夾?

    還有很多其他的可能性。