快递选项:
按产品 GUID 卸载: (find product GUID) - 下面第 3 节用于记录。还有:MSI logging in depth here:
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 缓存文件夹 strong>,以及下面介绍的其他一些选项。
前几段提供了重要的 MSI 花絮,然后有 14 个部分提供了卸载 MSI 文件的不同方法。噗。
“Babble, Babble - Over”: 1、2 和 部分3 是正常卸载方法(因此推荐)。 Personally I use option 3 or 5 from section 3(两个选项都带有日志记录,但选项 5 静默运行
以及)。如果你很忙,跳过所有的喋喋不休,去做一个
其中 - 它将完成工作。
如果您完全卸载时遇到问题,并且正在寻找已弃用的 MsiZap.exe 和/或 Windows Installer CleanUp Utility (MSICUU2.exe),你可以试试新的FixIt tool from Microsoft (or the international page)。显然也适用于其他安装问题。
较新的清理方法列表:Cleaning out broken MSI uninstalls。
如果您认为 MSI 和 Windows Installer 麻烦多于其价值,您可能想了解一下the corporate benefits of using MSI files。
Installscript MSI 设置通常包含在 setup.exe 文件中。要详细了解用于卸载此类设置的参数,请参阅以下链接:setup.exe pdf reference sheet、Setup.exe and Update.exe Command-Line Parameters。
一些 MSI 文件通过 Burn (WiX Toolkit) 或 InstallShield Suite 项目等机制作为 bundles 的一部分安装。这会使卸载与下面看到的略有不同。这里是an example for InstallShield Suite projects。
请注意,静默或交互式运行卸载可能会导致不同的结果 (!)。如需详细说明为什么会出现这种情况,请阅读这篇文章:Uninstall from Control Panel is different from Remove from .msi
如果在尝试卸载时意外要求您提供原始安装介质,请阅读此答案:Why does MSI require the original .msi file to proceed with an uninstall?,也许还请阅读下面的第 12 节了解一些重要的技术细节。
如果您安装了CCleaner 或类似的清理工具,或许可以跳转到第 11 节。
如果卸载完全失败(无法运行),请参阅下面的第 12 和 13 节,了解使用 system restore 和/ 或清理工具。
1 - Using the original MSI
- 如果您有权访问用于安装的原始 MSI,您只需在 Windows 资源管理器 中右键单击它并选择卸载。
- 您也可以按照第 3 节中的说明通过命令行卸载。
2 - Using the old ARP Applet OR new Windows 8/10 Settings Interface
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 文件 - here is how to find the product 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:使用刷新的详细日志文件进行交互式卸载(verbose, flush to log option - 连续写入日志,可能非常慢):
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:
How can I find the product GUID of an installed MSI setup?(如果您没有要在卸载命令中指定的原始 MSI,则用于卸载)。
4 - Using the cached MSI database in the super hidden cache folder
get-wmiobject Win32_Product | Format-Table Name, LocalPackage -AutoSize
6 - Using the .NET DTF Class Library(the WiX toolkit 的一部分)
using Microsoft.Deployment.WindowsInstaller;
public static void Uninstall( string productCode)
{
Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "REBOOT=\"R\"");
}
- Windows Installer 主要升级可能会作为安装另一个 MSI 文件的一部分发生。
- 通过在 MSI 的“Upgrade table”中标识相关产品来进行重大升级。然后按照表中的规定处理这些相关设置。通常这意味着它们已被卸载,但也可以中止主设置(通常用于检测盒子上存在的您自己的应用程序的更高版本)。
9 - Using Deployment Systems / Remote Administration Systems
10 - Using WMI - Windows Management Instrumentation
11 - Using a third-party tool such as ccleaner or similar
- 一些 Windows 应用程序具有自己的界面,不仅可以卸载 MSI 软件包,还可以卸载旧版安装程序。
- 我不想在这里提出任何具体的工具推荐(尤其是商业工具),但是众所周知的CCleaner 具有这样的卸载界面(并且它有免费版本)。我还应该补充一下this tool suffered a malware attack recently。
- 我想我们都应该记住,即使是无害的软件也可以在其下载位置注入恶意软件(FTP 攻击)。
- 像这样卸载应该可以正常工作。我认为当您尝试它们的“清理功能”时,这些工具会搞砸太多事情。谨慎使用。如果只使用卸载功能,应该没问题。
12 - Using a cleanup tool such as msizap or similar
- 为了完整起见,应提及
msizap.exe,尽管它已弃用、不支持和过时。不应在任何较新的 Windows 版本上使用它
- 此命令行工具 (
msizap.exe) 也有一个可用的 GUI (MSICUU2.exe)。这两种工具都已弃用。
- 这些工具的预期用途是清除失败的卸载:
- 通常在极少数情况下,带有随机名称的缓存 MSI 错误丢失,因此在请求原始 MSI 时卸载失败。这是一个罕见的问题,但我自己也看到过。只是一些潜在的原因:Moved to this answer。
-
This newer support tool(这个工具现在也被弃用了)如果你有失效的 MSI 包需要卸载,可以在最近的 Windows 版本上试用。
- 有些人建议使用 saschabeaumont 链接到此处的工具:Uninstall without an MSI file。如果您尝试过并且有效,请务必告知我们。
- 如果您有权访问实际用于安装产品的原始 MSI,则可以使用它来运行卸载。它必须是所使用的确切 MSI,而不仅仅是类似的。
13 - Using system restore ("installation undo" - last resort IMHO)
- 严格来说,这不是“卸载”的方法,而是“撤消”最后一次安装或多次安装的方法。
- 通过还原点进行还原会使系统恢复到之前的安装状态(您可以在 YouTube 或类似网站上找到这方面的视频演示)。
- 请注意,该功能可以完全或部分禁用 - 可以永久禁用整台机器,也可以在每次安装时临时禁用。
-
我看到了系统还原导致的新的、无法解决的安装问题,但通常它可以正常工作。显然不要为了好玩而使用该功能。这是最后的手段,最适用于回滚新驱动程序或刚刚安装并被发现会立即导致问题(bluescreen、重新启动、不稳定等)的设置。
- 返回的时间越长,您为自己创建的返工就越多,风险也就越高。大多数系统只有几个还原点,而且我相信它们中的大多数只能恢复一两个月。
- 请注意,系统还原可能会影响必须重新应用的 Windows 更新 - 以及许多其他系统设置。除了纯粹的烦恼之外,这还可能导致安全问题再次出现,您可能希望使用 Microsoft Baseline Security Analyzer 或类似工具对目标框运行特定的安全检查。
- 既然我提到了系统还原,我想我应该提到the Last Known Good Configuration feature。此功能与卸载或系统还原无关,但它是最后一次有效或导致系统运行的引导配置。如果系统在引导过程中蓝屏或停止,它可用于让您的系统再次运行。这通常发生在驱动程序安装后。
14 - Windows Installer Functions (C++)
为了完整起见,我想我们应该提到这一切的核心 - 深入浅出的方式:the Win32 Windows Installer API functions。这些可能是大多数(如果不是所有上面列出的“引擎盖下”的其他方法的话)所使用的功能。它们主要由直接将 MSI 作为一种技术处理的应用程序或解决方案使用。
在 serverfault.com 上有一个答案,可能是 a summary of the different programmatic approaches for uninstalling(COM 自动化、.NET、Win32 安装程序函数)。
您将在下面找到一个 C++ sn-p,它显示了如何使用对 MsiConfigureProductEx function 的调用按产品代码卸载 Orca, 10.1.17134.12。要卸载其他产品,请将为 prodcode 指定的 GUID 替换为您的产品的 GUID。要查找产品代码,请参阅此答案:How can I find the product GUID of an installed MSI setup?
卸载将在全 GUI 模式下进行。要在静默模式或其他一些 GUI 模式(精简、基本等)下运行,请参阅:MsiSetInternalUI function。
#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
}
sn-p 是使用截至 2018 年 9 月的最新版本 Visual Studio 2017 制作和测试的:
-
从 Visual C++ => Windows 桌面创建一个新的“Windows 控制台应用程序”。
-
将上述代码复制并粘贴到您的主 CPP 文件中(替换其中的任何内容)。
-
应该是它能够运行代码。也许设置一个断点,构建并运行。