为啥 MSI 需要原始 .msi 文件才能继续卸载?

Posted

技术标签:

【中文标题】为啥 MSI 需要原始 .msi 文件才能继续卸载?【英文标题】:Why does MSI require the original .msi file to proceed with an uninstall?为什么 MSI 需要原始 .msi 文件才能继续卸载? 【发布时间】:2010-09-17 12:51:51 【问题描述】:

大多数人可能已经注意到,在卸载 MSI 软件包时,Windows 会要求提供原始的 .msi 文件。这是为什么呢?

我只能看到它的缺点:

无法适应网络变化。 对本地磁盘更改没有弹性。 出乎用户意料。 通常要求用户离开办公桌并开始争取获得正确的 CD。 证明安装不是独立的。 提倡使用不安全的工具,例如 msizap。 这反过来又促进了“下次我只使用 zip 文件”的心态。

有人能解释一下吗?

【问题讨论】:

【参考方案1】:

修复损坏的卸载:如果您在卸载 MSI 时遇到问题,可以尝试最新的 FixIt Uninstall tool from Microsoft。还有一个链接:Uninstalling an MSI file from the command line without using msiexec(卸载 MSI 的多种不同方法)。


更新

This new support tool(此工具现在也已弃用)如果您有需要卸载的已失效 MSI 软件包(而不是过时、弃用的, 不支持 msizap.exe)。

有些人建议使用 saschabeaumont 链接到此处的工具:Uninstall without an MSI file。如果您尝试了它并且它有效,请务必让我们知道。该答案中的反馈表明它有效(到目前为止,我没有任何卡住的设置可供测试)。


为什么要求您提供原始安装介质?

卸载时不需要原始 MSI,除非 MSI 本身设计不当 - 或者缓存的 MSI 丢失(请参阅下面的详细信息)。 所有已安装的 MSI 文件都使用随机十六进制名称缓存在 %SystemRoot%\Installer\*.* 中。 缓存的 MSI 文件用于任何维护修复卸载操作 - 它足以在绝大多数情况下卸载案例。 在某些情况下此缓存文件可能丢失,然后在某些情况下根本无法卸载(some theories as to why this can happen - MSI design errors , anti-virus quarantining, system restore, tinkering, developer system in erroneous state from development work, @987654342 @)。请参阅下面的更多信息 - 以及强制卸载或注销产品的链接。 原始来源仅在需要将文件复制到磁盘(用于维护安装)或 MSI 发出显式请求以通过标准解析原始来源时才需要操作 ResolveSource 或通过自定义操作(不应在正确编写的包中完成 - 我认为 MS Office 包在当天包含此 ResolveSource 错误,导致每个人都去寻找他们的安装 CD/DVD)。 在以前的 Windows 版本中,此缓存的 MSI 已删除所有 cab,因此仅包含安装程序结构,不包含文件。 从 Windows 7(MSI 版本 5)开始,MSI 文件现在以全尺寸缓存以避免破坏文件签名,从而影响安装程序启动时的 UAC 提示(a已知的 Vista 问题)。这可能会导致磁盘空间消耗的巨大增加(某些系统为几 GB)。 Check this article and especially the discussion at the bottom for more intel。 为防止缓存巨大的 MSI 文件,您可以在安装前运行软件包的 admin-install。这就是在托管网络中进行适当部署的公司将如何做事,它将剥离 cab 文件并使用一个小的 MSI 文件和除此之外的文件创建一个网络安装点。 请注意,在某些情况下,这可能会产生 UAC 提示,因为提取的 MSI 文件不再签名 - 这必须使用您的 SOE/桌面配置进行测试。 阅读我在此线程中的答案以获取有关管理员安装的完整描述:What is the purpose of administrative installation initiated using msiexec /a? 或类似但可能更易于访问的答案:admin install and its uses 在极少数情况下,缓存的 MSI(具有随机名称)可能会错误地丢失,然后卸载会要求原始 MSI 以完成卸载。这种情况并不经常发生。以前可以使用 MsiZap.exe 来清除这样的安装,但是这个工具过时已弃用不支持。不要使用它 - 与较新的 Windows 版本有太多不兼容,并且会产生新问题。也许尝试 this support tool 代替(也已弃用)。我现在可以建议的唯一选择是this answer from saschabeaumont如果您尝试使用此工具,请告诉我们它是否适合您。如果您想找出可能导致缓存 MSI 丢失的原因,请尝试阅读此处的第 12 节:Uninstalling an MSI file from the command line without using msiexec(简而言之,潜在原因包括干扰系统还原、防病毒和清理脚本,以及错误的手动调整,磁盘空间不足、断电、开发者盒子调试错误、设计错误的 MSI 文件和重复的包代码、失败的补丁等等……很多理论,恐怕没有什么确定性)。 作为最后的手段,您可以尝试 system restore(除非它已完全或部分禁用)返回到之前的安装状态,看看是否可以解决您的卸载问题(您可以在 youtube 或类似网站上找到这方面的视频演示)。 请注意,系统还原可能会影响必须重新应用的 Windows 更新 - 以及许多其他系统设置。我看到系统还原导致新的、无法解决的安装问题,但通常可以正常工作。显然不要为了好玩而使用该功能,这是最后的手段,最适合用于回滚新驱动程序或刚刚安装并被发现会立即导致问题等问题。你回去的时间越长,你为自己创造的返工就越多。很多不言而喻的东西,但我想有必要提一下。 既然我提到了系统还原,我想我应该提到the Last Known Good Configuration feature。此功能与卸载或系统还原无关,但它是最后一次有效或导致系统运行的引导配置。如果系统在引导过程中蓝屏或停止,它可用于让您的系统再次运行。这通常发生在驱动程序安装后。不过,这对修复失败的卸载无济于事(否则我会非常感到惊讶)。

相关答案:

Uninstall without an MSI file

除了这个答案之外,也许这篇关于卸载 MSI 软件包的各种方法的文章也很有趣。这是一篇相当受欢迎的文章浏览量很高

Uninstalling an MSI file from the command line without using msiexec

【讨论】:

这实际上是一个比接受的答案更好的答案。 10 月 16 日接受的答案充满了不准确之处。 重要的一点是不准确的:不是“较新版本”(Win7 于 2009 年 10 月 22 日发布):从 MSI 5.0 (>= Windows 7) 开始,MSI 没有剥离 cabs 并完全缓存。原因被告知:因为签名的 MSI 文件(我不同意,但这是一个好的决定。)这会导致所有包含 .cab 文件的 MSI 占用大量且不必要的磁盘空间。因此,现在和未来的良好做法是永远不要设计包含 cab 的 MSI 文件,而是将 .cab 文件放在外面。尤其是使用 InstallShield,这很奇怪,因为它们只允许每个功能。 对于那些需要一个文件设置的人来说,要走的路是自解压 setup.exe 引导程序(如果还没有使用完整的多 msi 功能引导程序,如 Burn、Setup factory 或 InstallShield/Suite 类型. 这里是关于这个主题的另一个讨论:csi-windows.com/toolkit/csicachedpackageassource 我上面评论中的句子“一个..点不准确”现在已经过时了,因为已经包含在已经非常好的答案中。谢谢。【参考方案2】:

保留原来的msi有几个原因:

卸载程序使用它来了解安装了哪些文件和注册表项,并确保将它们全部清除。 msi 可能包含需要执行的特殊卸载操作。 它允许您从“添加/删除程序”菜单执行“修复”操作,无论您是否自己保存了安装文件。

正常的事情是 Windows 为您保留文件缓存,因此您不必考虑它。查看您的 %WINDIR%\Installer\ 文件夹。它会要求您提供原始 msi 的唯一原因是保存的文件是否有问题。这解决了您的大部分问题,尽管它确实提出了一个新问题(磁盘空间)。

【讨论】:

那么使用注册表本身来存储为启用卸载而添加的操作和键呢?这比存储整个文件更有意义。在没有 msi 时修复死机是完全可以预料的,但在我的书中没有卸载是一个禁忌。 我不为 MS 工作:接受他们 ;) 但是在注册表中存储这么多信息可能也不是一个好主意。它已经足够臃肿了。 哦:但我同意系统应该足够聪明,如果原始文件丢失,仍然可以进行某种“基本”卸载。但同样,我不为 MS 工作。 我相信系统应该真正存储#1 和#2 所需的所有内容。从用户的角度来看,#3 可能需要原始安装,没有人会对此感到惊讶。你是正确的安装文件夹......我想我现在必须重新安装我的盒子......谢谢。 %WINDIR%\Installer\ 中的 MSI 文件是原始安装的“剥离”版本,因此它们不会占用太多磁盘空间。

以上是关于为啥 MSI 需要原始 .msi 文件才能继续卸载?的主要内容,如果未能解决你的问题,请参考以下文章

从命令行卸载 MSI 文件而不使用 msiexec

InstrallShield Basic MSI 卸载不显示带有完成按钮的对话框

如何从以前的非 msi 安装中复制文件?

MSI 未卸载 .dll 文件

在 BizTalk 中,为啥要同时导入和安装 MSI 文件?

MSI没有卸载.dll文件