Dot-Net

從命令行解除安裝 MSI 文件而不使用 msiexec

  • January 16, 2009

msiexec是安裝MSI程序的命令提示符軟體。但是我發現您可以通過在命令行中輸入 MSI 文件的名稱來從命令行安裝 MSI 文件。

但是為了解除安裝 MSI 文件,您似乎必須呼叫該msiexec程序並給它一個/xor /uninstall

msiexec如何在不使案常式的情況下從命令行解除安裝 MSI ?

簡短的回答:你不能。使用 MSIEXEC /x

長答案:當您直接在命令行執行 MSI 文件時,所發生的只是它為您執行 MSIEXEC。此關聯儲存在系統資料庫中。您可以通過(在 Windows 資源管理器中)轉到工具/文件夾選項/文件類型來查看關聯列表。

例如,您可以從命令行執行 .DOC 文件,WordPad 或 WinWord 將為您打開它。

如果您在系統資料庫中HKEY_CLASSES_ROOT\.msi查看,您會看到 .MSI 文件與 ProgID“Msi.Package”相關聯。如果您查看HKEY_CLASSES_ROOT\Msi.Package\shell\Open\command,您將看到 Windows 在“執行” .MSI 文件時實際使用的命令行。

快遞選項:

***按產品 GUID 解除安裝:(***查找產品 GUID)- 下面第 3 節進行日誌記錄。還有: MSI在這裡深度記錄

msiexec.exe /x {11111111-1111-1111-1111-11111111111X}

通過 MSI 文件解除安裝:

msiexec.exe /x "c:\filename.msi"

快捷互動:

Right click MSI file in Windows Explorer and select "Uninstall".

有很多方法可以解除安裝 MSI 軟體包。以下旨在作為“參考”:

總之,您可以通過以下方式解除安裝:msiexec.exeARPWMIPowerShell、部署系統,例如SCCMVBScript /COM 自動化、DTF,或通過隱藏的 Windows 記憶體文件夾,以及下面介紹的其他一些選項。

前幾段提供了重要的 MSI 花絮,然後有14 個部分提供了解除安裝 MSI 文件的不同方法。噗。

“Babble, Babble - Over”: 第 1、2 和3正常解除安裝方法(因此推薦)。Personally I use option 3 or 5 from section 3(兩個選項都帶有日誌記錄,但選項 5 也靜默執行)。如果你很忙,跳過所有的喋喋不休,去做其中之一——它會完成工作。


如果您在完全解除安裝時遇到問題並正在尋找已棄用的替代方案MsiZap.exe和/或 Windows Installer 清理實用程序 (MSICUU2.exe),您可以嘗試微軟的新 FixIt 工具或國際頁面)。顯然也適用於其他安裝問題。

更新的清理方法列表:清理損壞的 MSI 解除安裝


如果您認為MSIWindows Installer帶來的麻煩多於其價值,您可能想了解使用 MSI 文件的企業優勢


Installscript MSI設置通常包含在setup.exe 文件中。要了解有關用於解除安裝此類設置的參數的更多資訊,請參閱以下連結:setup.exe pdf 參考表Setup.exe 和 Update.exe 命令行參數


一些 MSI 文件通過諸如**Burn** (WiX Toolkit) 或**InstallShield Suite項目之類的機製作為捆綁包的一部分安裝。**這會使解除安裝與下面看到的略有不同。這是InstallShield Suite 項目的範例


請注意,以靜默方式或互動方式執行解除安裝可能會導致不同的結果 (!)。有關為什麼會出現這種情況的詳細說明,請閱讀這篇文章:從控制面板解除安裝不同於從 .msi 中刪除


如果在嘗試解除安裝時意外要求您提供原始安裝介質,請閱讀此答案:**為什麼 MSI 需要原始 .msi 文件才能繼續解除安裝?**也許還有下面的第 12 節,了解一些重要的技術細節。


如果你安裝了CCleaner或類似的清理工具,或許可以跳到第 11 節


如果解除安裝完全失敗(無法執行),請參閱下面的第 12 和 13 節,了解使用系統還原和/或清理工具“撤消”安裝的潛在方法。


1 -Using the original MSI

  • 如果您有權訪問用於安裝的原始 MSI,您只需在Windows 資源管理器中****右鍵點擊它並選擇Uninstall
  • 您也可以按照第 3 節中的說明通過命令行解除安裝。

2 -Using the old ARP Applet OR new Windows 8/10 Settings Interface

  • 只是提到了正常的方法,雖然很明顯

  • ARP= Add / Remove Programs Applet( appwiz.cpl)

  • Windows 10 Settings Interface=> 相同操作的新外殼

  • ARP

    • 開始 執行 appwiz.cpl以打開添加/刪除程序小程序(或點擊控制面板中的添加/刪除程序 ENTER
    • 點擊要解除安裝的產品的“刪除”
  • 設置界面(Windows 8 / 10):

    • 在 Windows 8 / 10 中使用新的設置 GUI

      • Windows Key+ 點擊I=> Apps & Features。選擇進入並解除安裝。
    • 直接快捷方式:

      • Windows Key+ 點擊R=> 輸入:ms-settings:appsfeatures然後按Enter
    • 以這種方式呼叫解除安裝時的一些錯誤報告。如果看到請在下面添加評論。


3 -Using msiexec.exe command line (directly or via a batch file)

  • 您可以通過命令提示符( cmd.exe )、批處理文件或什至從執行檔中作為shell 操作進行解除安裝。
  • 為此,您可以將產品 GUID(查看下方以了解如何找到此GUID)或原始 MSI 文件的路徑(如果可用)傳遞給msiexec.exe
  • 對於下面的所有命令行,您可以添加/qn使解除安裝以靜默模式執行。這是從添加/刪除小程序觸發時解除安裝執行的方式。

選項 3.1:基本互動式解除安裝(訪問原始 MSI 文件):

msiexec.exe /x "c:\filename.msi"

選項 3.2:通過產品 GUID 進行基本互動式解除安裝(無法訪問原始 MSI 文件 -這是如何找到產品 GUID - 與以下相同的連結):

msiexec.exe /x {11111111-1111-1111-1111-11111111111X}

選項 3.3:使用詳細日誌文件進行互動式解除安裝

msiexec.exe /x "c:\filename.msi" /L*V "C:\msilog.log"
msiexec.exe /x {11111111-1111-1111-1111-11111111111X} /L*V "C:\msilog.log"

選項 3.4:使用刷新的詳細日誌文件進行互動式解除安裝詳細,刷新到日誌選項- 連續寫入日誌,可能非常慢):

msiexec.exe /x "c:\filename.msi" /L*V! "C:\msilog.log"
msiexec.exe /x {11111111-1111-1111-1111-11111111111X} /L*V! "C:\msilog.log"
  • 刷新到日誌選項使解除安裝變慢,因為日誌文件是連續寫入而不是分批寫入的。這可確保在安裝程序崩潰時不會失去日誌緩衝區。
  • 換句話說,如果您的設置崩潰並且詳細日誌文件中沒有有用的資訊,請啟用此選項。刪除驚嘆號以關閉刷新到日誌選項,解除安裝會更快。您仍然會獲得詳細的日誌記錄,但如前所述,可能會失去一些日誌緩衝區。

選項 3.5(推薦):使用詳細日誌文件進行靜默解除安裝 - 禁止重新啟動(不刷新日誌 - 請參閱上一個選項了解這意味著什麼):

msiexec.exe /x "c:\filename.msi" /QN /L*V "C:\msilog.log" REBOOT=R
msiexec.exe /x {11111111-1111-1111-1111-11111111111X} /QN /L*V "C:\msilog.log" REBOOT=R

快速參數說明(因為我推薦這個選項):

/X = run uninstall sequence
/QN = run completely silently
/L*V "C:\msilog.log"= verbose logging at path specified
{11111111-1111-1111-1111-11111111111X} = product guid of app to uninstall
REBOOT=R = prevent unexpected reboot of computer

同樣,如何找到產品 GUID: 如何找到已安裝 MSI 設置的產品 GUID?(如果您沒有要在解除安裝命令中指定的原始 MSI,則用於解除安裝)。


4 -Using the cached MSI database in the super hidden cache folder

  • MSI 刪除所有 cab(舊 Windows 版本)並將每個安裝在**%SystemRoot%\Installer**的超級隱藏系統文件夾中的 MSI 記憶體(您需要顯示隱藏文件才能看到它)。
  • 注意:這個超級隱藏的文件夾現在在 Windows 7 及以後的版本中被區別對待。MSI 文件現在全尺寸記憶體。閱讀連結的執行緒以獲取更多詳細資訊 - 建議任何找到此答案並擺弄危險 Windows 設置的人閱讀。
  • 通過使用管理員安裝來避免這些巨大的記憶體文件。關於磁碟空間的主題:如何擺脫巨大的記憶體 MSI 文件(和其他磁碟空間清理技巧)
  • 此處的所有 MSI 文件都將分配一個隨機名稱(十六進制格式),但您可以通過顯示 Windows 資源管理器狀態欄(查看 -> 狀態欄)然後選擇一個 MSI 來獲取有關每個 MSI 的資訊。來自 MSI 的摘要流將顯示在 Windows 資源管理器視窗的底部。或者正如 Christopher Galpin 指出的那樣,打開 Windows 資源管理器中的“評論”列並選擇 MSI 文件(請參閱本文了解如何執行此操作)。
  • 關於使用 Windows 資源管理器的簡短回答
  • 找到正確的 MSI 後,只需右鍵點擊它並進行解除安裝。
  • 您還可以使用 PowerShell 顯示本地記憶體包的完整路徑以及產品名稱。這是我認為最簡單的選擇。
  • 要啟動PowerShell按住 Windows 鍵,點擊 R,釋放 Windows 鍵,輸入“powershell”,然後按 OK。然後最大化 PowerShell 視窗並執行以下命令:
 get-wmiobject Win32_Product | Format-Table Name, LocalPackage -AutoSize

在此處輸入圖像描述


5 -Using PowerShell

$app = Get-WmiObject -Class Win32_Product -Filter "Name = 'YOUR_APP'"
$app.Uninstall()
  • 這種方法可行,但訪問 WMI 類 Win32_Product 將觸發軟體一致性檢查,該檢查速度非常慢,在特殊情況下可能會觸發 MSI 自我修復。請參閱這篇文章:Powershell 解除安裝腳本 - 真的很頭疼
  • 我自己沒有對此進行測試,但似乎 $app.Uninstall() 可能會執行在 ARP 小程序的系統資料庫設置中註冊的 UninstallString。這意味著它在某些情況下可能會執行修改而不是解除安裝。
  • 查看此主題以獲取更多詳細資訊以及通過 Powershell 解除安裝的方法:如何使用 PowerShell 解除安裝應用程序?

6 - Using the .NET DTF Class LibraryWiX 工具包的一部分)

   using Microsoft.Deployment.WindowsInstaller;

   public static void Uninstall( string productCode)
   {
     Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "REBOOT=\"R\"");
   }

7 -Using the Windows Installer Automation API

Set installer = CreateObject("WindowsInstaller.Installer")
installer.InstallProduct "product.msi", "REMOVE=ALL REBOOT=ReallySuppress"
Set installer = Nothing

8 -Using a Windows Installer major upgrade

  • 作為安裝另一個 MSI 文件的一部分,可能會發生 Windows Installer 主要升級。
  • 重大升級是通過在 MSI 的“升級表”中辨識相關產品來編寫的。然後按照表中的規定處理這些相關設置。通常這意味著它們已被解除安裝,但也可以中止主設置(通常用於檢測盒子上存在的您自己的應用程序的更高版本)。

9 -Using Deployment Systems / Remote Administration Systems

  • SCCMCA UnicenterIBM 的 TivoliAltiris Client Management Suite 等
  • 這些工具具有高級客戶端 PC 管理功能,包括安裝和解除安裝 MSI 文件
  • 這些工具似乎使用 msiexec.exe、自動化、WMI等的組合……甚至它們自己呼叫安裝和解除安裝的方式。
  • 根據我的經驗,這些工具具有很多“個性”,您需要適應它們不同的做事方式。

10 -Using WMI - Windows Management Instrumentation


11 -Using a third-party tool such as ccleaner or similar

  • 一些 Windows 應用程序具有自己的界面,不僅可以解除安裝 MSI 軟體包,還可以解除安裝舊版安裝程序。

  • 我不想在這裡提出任何具體的工具推薦(尤其是商業工具),但是眾所周知的CCleaner具有這樣的解除安裝界面(並且它有免費版本)。我還應該補充一點,這個工具最近遭受了惡意軟體攻擊

  • 我想我們都應該記住,即使是無害的軟體也可以在其下載位置注入惡意軟體(FTP 攻擊)。

    • 我使用virustotal.com檢查我的下載,並使用Sysinternals Process Explorer在安裝後檢查正在執行的程序 - 以及正常安全軟體(以可用者為準)。
    • 使用這種方法通常會發現數量驚人的“灰色區域”軟體(工具欄、笑臉、廣告軟體等),以及一些誤報(它們也可能導致問題,因為安全軟體會阻止他們的訪問或隔離他們進行很多絨毛)。當然還有真正的惡意軟體。
    • 可以在此處找到 Process Explorer 的一些使用提示- 一系列推文 - 此 Process Explorer 工具連接到VirusTotal.com以互動方式檢查所有正在執行的程序 - 您只需要幾個配置步驟。
    • 我應該注意到 Process Explorer 會產生文件簽名檢查,但沒有啟發式 - 據我了解(沒有檢查可疑操作,只是檢查 60 多個安全套件來檢查標記文件)。您需要一個正常的安全工具來進行互動式線上啟發式保護。
    • 就其價值而言,我認為某些安全軟體會導致比惡意軟體造成的損害更多的誤報問題。勒索軟體時代著名的遺言……
    • 這是一個足夠大的題外話——我只是不想看到人們下載惡意軟體。至少檢查一下你的virustotal.com
  • 像這樣解除安裝應該可以正常工作。我認為當您嘗試它們的“清理功能”時,這些工具會搞砸太多事情。謹慎使用。如果只使用解除安裝功能,應該沒問題。


12 -Using a cleanup tool such as msizap or similar

  • 為了完整性msizap.exe應該提到雖然它已被棄用不受支持過時。不應在任何較新的 Windows 版本上使用它

  • 這個命令行工具(msizap.exe) 還有一個可用的 GUI (MSICUU2.exe)。這兩種工具都已棄用。

  • 這些工具的預期用途是清除失敗的解除安裝

  • 通常,在極少數情況下,帶有隨機名稱的記憶體 MSI 錯誤失去並且解除安裝失敗,同時要求原始 MSI。這是一個罕見的問題,但我自己也看到過。只有幾個潛在的原因:移至此答案

    • 關鍵詞:系統還原干擾、不良清理應用程序、msiexec.exe 崩潰、斷電、安全軟體干擾、MSI 開發調試錯誤(相同的包程式碼等…)、使用者修補和黑客攻擊(這裡有什麼?節省空間?), 等等…
    • 它也可以用來破壞任何 MSI 安裝,儘管這顯然是不可取的。
    • 更多資訊:為什麼 MSI 需要原始 .msi 文件才能繼續解除安裝?
  • 這個更新的支持工具(此工具現在也已棄用)如果您有需要解除安裝的失效 MSI 軟體包,可以在最近的 Windows 版本上試用。

  • 有些人建議使用 saschabeaumont 連結到此處的工具:Uninstall without a MSI file。如果您嘗試了它並且它有效,請務必讓我們知道。

  • 如果您有權訪問實際用於安裝產品的原始 MSI,則可以使用它來執行解除安裝。它必須是所使用的確切 MSI,而不僅僅是類似的。


13 -Using system restore ("installation undo" - last resort IMHO)

  • 嚴格來說,這不是“解除安裝”的方式,而是“撤消”最後一次安裝或多次安裝的方式。
  • 通過還原點還原會使系統恢復到以前的安裝狀態(您可以在 YouTube 或類似網站上找到此影片展示)。
  • 請注意,該功能可以完全或部分禁用 - 可以永久禁用整台機器,或每次安裝即席。
  • 我看到了系統還原導致的新的、無法解決的安裝問題,但通常可以正常工作。顯然不要為了好玩而使用該功能。這是最後的手段,最適合用於回滾剛剛安裝的新驅動程序或設置,並發現會立即導致問題(藍屏、重新啟動、不穩定等)。
  • 你回去的時間越長,你為自己創造的返工就越多,風險就越高。大多數係統只有幾個還原點,而且我相信它們中的大多數只能追溯到一兩個月。
  • 請注意,系統還原可能會影響必須重新應用的Windows 更新以及許多其他系統設置。除了純粹的煩惱之外,這還可能導致安全問題再次出現,您可能希望使用Microsoft Baseline Security Analyzer或類似工具對目標框執行特定的安全檢查。
  • 由於我提到了系統還原,我想我應該提到Last Known Good Configuration 功能。此功能與解除安裝或系統還原無關,但它是最後一次有效或導致系統執行的引導配置。如果系統在引導過程中藍屏或停止,它可用於讓您的系統再次執行。這通常發生在驅動程序安裝後。

14 -Windows Installer Functions (C++)

為了完整起見,我想我們應該提到這一切的核心 - 最簡單的方法:Win32 Windows Installer API 函式。這些可能是大多數(如果不是所有上面列出的“引擎蓋下”的其他方法的話)所使用的功能。它們主要用於直接將 MSI 作為技術處理的應用程序或解決方案。

serverfault.com 上有一個答案,作為解除安裝的不同程式方法(COM 自動化、.NET、Win32 安裝程序功能)的總結,可能很有趣。

您將在下面找到一個 C++ 片段,顯示如何Orca, 10.1.17134.12使用呼叫MsiConfigureProductEx 函式按產品程式碼解除安裝。要解除安裝另一產品,請將為您指定的 GUID 替換prodcode為您的產品的 GUID。要查找產品程式碼,請參閱此答案:如何找到已安裝 MSI 設置的產品 GUID?

解除安裝將在完全 GUI 模式下進行。要在靜默模式或其他一些 GUI 模式(精簡、基本等)下執行,請參閱:MsiSetInternalUI 函式

#include "pch.h"

#define WIN32_LEAN_AND_MEAN //Minimize includes from Windows.h
#include <windows.h>
#include <msi.h> // Windows Installer
#include <tchar.h> 

#pragma comment(lib, "msi.lib") // To make code link

int main()
{
   const TCHAR noreboot[] = _T("REBOOT=ReallySuppress");
   const TCHAR prodcode[39] = _T("{D7B80ABC-1950-37B8-F851-C3783EED9C93}"); // Orca, 10.1.17134.12

   UINT res = MsiConfigureProductEx(prodcode, INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT, noreboot);

   return res; // Error Codes: https://msdn.microsoft.com/en-us/library/windows/desktop/aa376931(v=vs.85).aspx
}

截至 2018 年 9 月,該程式碼段是使用最新版本的Visual Studio 2017製作和測試的:

  1. 從 Visual C++ => Windows 桌面創建一個新的“Windows 控制台應用程序”。
  2. 將上述程式碼複製並粘貼到您的主 CPP 文件中(替換其中的任何內容)。
  3. 那應該是它能夠執行程式碼。也許設置一個斷點,建構並執行。
  • 當心 VS2017 中預設模板的更改,以及可能導致的奇怪錯誤:IntelliSense 引擎無法正常執行的錯誤太多
  • 2018 年 9 月更新:模板再次更改。我不再看到上述問題。
  • 程式碼中的 MSDN 連結列出了從 msiexec.exe 返回的可能的錯誤消息。

引用自:https://stackoverflow.com/questions/450027