为啥 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 以完成卸载。这种情况并不经常发生。以前可以使用 相关答案:
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 文件才能继续卸载?的主要内容,如果未能解决你的问题,请参考以下文章
InstrallShield Basic MSI 卸载不显示带有完成按钮的对话框