從命令行解除安裝 MSI 文件而不使用 msiexec
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.exe、ARP、WMI、PowerShell、部署系統,例如SCCM、VBScript /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 解除安裝。
如果您認為MSI和Windows 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,則用於解除安裝)。
重要提示:如果您為解除安裝創建日誌文件,您可以通過搜尋“值 3”在日誌中找到問題。這對於詳細文件特別有用,因為它們非常詳細:-)。
如何找到已安裝 MSI 的產品 GUID?
- 有幾種方法,我推薦的方法是使用 Powershell:如何找到已安裝 MSI 設置的產品 GUID?
- 此處描述的其他幾種方法(系統資料庫、本地記憶體文件夾等):從 MSI 文件中查找 GUID
有關從installsite.org進行日誌記錄的更多資訊:如何創建我的安裝日誌文件?- 不同選項的偉大概述以及 InstallShield 日誌記錄的細節。
Msiexec(命令行選項) -來自MSDN的****msiexec.exe命令行概述。這是Technet 版本。
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
- 另請參閱此答案:如何找到已安裝的 MSI 設置的產品 GUID?
5 -
UsingPowerShell
- MSDN 上有一個類似但更全面的 PowerShell 腳本。它允許在多台機器上執行解除安裝。
- Even Mien 添加的條目:
$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 Library(WiX 工具包的一部分)
- 此選項是為進入部署和 MSI 的開發人員提供的- 作為“快速修復”,它實際上並不實用。它要求您下載WiX 工具包- 一個免費的框架,用於創建從 XML 源文件編譯的 MSI 文件。
- 快速了解 WiX 及其“歷史”:Windows Installer 和 WiX 的創建。這是 WiX 與其他部署工具(商業)的對比- (優點和缺點 - 希望盡可能客觀)。
- DTF(部署工具基金會)作為 WiX 的一部分分發,如下所述:部署工具基金會的原始碼是否可用?.
- DTF 本質上是Win32 Windows Installer API 的 .NET 包裝器。通過自動化與 Windows Installer 一起工作時,它消除了對 COM 互操作的所有需求,並且是**.NET 的瑰寶**——也許是我見過的最容易使用的 .NET 庫。強烈推薦 - 非常適合用 C# 培訓學生。
- 以下來源來自 MSI 專家Christopher Painter使用 C# 和 DTF。Microsoft.Deployment.WindowsInstaller 是 DTF 程序集之一。請參閱 serverfault.com 上解釋的其他程序集:
using Microsoft.Deployment.WindowsInstaller; public static void Uninstall( string productCode) { Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "REBOOT=\"R\""); }
- Tom Blodget 的另一種選擇:檢查解除安裝是否成功
- 有關msiexec.exe與自動化的更多資訊,請訪問:serverfault.com。
7 -
Using theWindows Installer Automation API
- 以下是對此選項的社區討論:Windows Installer Automation API community sample
- API 可以通過腳本自動化和 C++ API 呼叫來訪問(我在 serverfault.com 上的文章)
- 以下來源改編自 MSI 專家Christopher Painter使用VBScript:
Set installer = CreateObject("WindowsInstaller.Installer") installer.InstallProduct "product.msi", "REMOVE=ALL REBOOT=ReallySuppress" Set installer = Nothing
- 這是另一個通過 Symantec GUID 解除安裝的 VBScript:http ://www.symantec.com/connect/downloads/uninstall-application-using-guid-registry
- 通過升級程式碼和 ConfigureProduct 解除安裝。
8 -
Using aWindows Installer major upgrade
- 作為安裝另一個 MSI 文件的一部分,可能會發生 Windows Installer 主要升級。
- 重大升級是通過在 MSI 的“升級表”中辨識相關產品來編寫的。然後按照表中的規定處理這些相關設置。通常這意味著它們已被解除安裝,但也可以中止主設置(通常用於檢測盒子上存在的您自己的應用程序的更高版本)。
9 -
Using Deployment Systems / Remote Administration Systems
- SCCM、CA Unicenter、IBM 的 Tivoli、Altiris Client Management Suite 等
- 這些工具具有高級客戶端 PC 管理功能,包括安裝和解除安裝 MSI 文件
- 這些工具似乎使用 msiexec.exe、自動化、WMI等的組合……甚至它們自己呼叫安裝和解除安裝的方式。
- 根據我的經驗,這些工具具有很多“個性”,您需要適應它們不同的做事方式。
10 -
Using WMI - Windows Management Instrumentation
- 添加只是為了完整性。不建議使用這種方法,因為它非常慢
- 每次安裝時每次呼叫Win32_Product都會觸發軟體一致性檢查
- 一致性檢查非常慢,而且還可能觸發軟體修復。請參閱這篇文章:Powershell 解除安裝腳本 - 真的很頭疼
- 更糟糕的是,有些人報告他們的事件日誌充滿了 MsiInstaller EventID 1035 條目- 顯然是由對 Win32_Product 類的 WMI 查詢引起的(我個人從未見過這種情況)。
- WMICodeCreator.exe程式碼創建工具可用於 實驗
- 安裝可以通過呼叫
Win32_Product.Install- 解除安裝可以通過呼叫
Win32_Product.Uninstall- MSDN 範例:Win32_Product 類的解除安裝方法
11 -
Using a third-party tool such asccleaneror 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 asmsizapor 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 -
Usingsystem 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製作和測試的:
- 從 Visual C++ => Windows 桌面創建一個新的“Windows 控制台應用程序”。
- 將上述程式碼複製並粘貼到您的主 CPP 文件中(替換其中的任何內容)。
- 那應該是它能夠執行程式碼。也許設置一個斷點,建構並執行。
當心 VS2017 中預設模板的更改,以及可能導致的奇怪錯誤:IntelliSense 引擎無法正常執行的錯誤太多。- 2018 年 9 月更新:模板再次更改。我不再看到上述問題。
- 程式碼中的 MSDN 連結列出了從 msiexec.exe 返回的可能的錯誤消息。
