我正在尝试弄清楚 Windows(从 XP 到 7)如何处理 MSI 文件的安装和卸载。我遇到过 Windows Installer 无法卸载的情况,因为它缺少原始 MSI 文件,这让我相信它将所有已安装 MSI 软件包的副本存储在某个地方。在哪里?
我曾有过几种理论。
它希望它位于与安装时相同的文件夹中。注册表项确实
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
指向原始安装文件夹,并且 MSI 文件丢失时的错误消息通常指向此文件夹。但是从此文件夹中删除 MSI 文件不会妨碍卸载过程,所以我拒绝了这个理论。C:\Windows\Installer
。此文件夹实际上包含一堆看似随机命名的 MSI 文件。但此列表并不完整。我确实在 1) 中提到的注册表项中找到了此文件夹中没有 MSI 副本的条目。
那么这是如何工作的呢?即使 MSI 不在 1) 中也不在 2) 中,Windows 安装程序如何能够卸载 MSI 安装的应用程序?
答案1
显然它是这样工作的(在 Windows 7 上,我不知道 XP 和其他操作系统):
当用户安装某些应用程序时,Windows 会执行以下操作:
1)创建注册表项
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[产品 ID GUID]
对于这个应用程序。
如果您有权访问应用程序安装程序的原始 msi 文件,您可以通过在 orca.exe 中打开 msi 文件并单击 orca 左侧的“属性”,然后在右侧查找“ProductCode”行来找到 [ProductID GUID]。如果您无权访问原始 *.msi 文件,您只需搜索注册表项 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 即可找到应用程序的名称。
如果您想从控制面板中已安装的应用程序列表中删除您的应用程序(例如,拒绝卸载),您可以从此卸载键中删除该条目。它肯定会从控制面板中的列表中消失,但 Windows 仍会记住它。例如,如果您尝试安装同一应用程序的下一个版本,安装程序可能仍会坚持卸载上一个版本。有关详细信息,请参阅第 2 项。
2) Windows 将原始 *.msi 文件复制到文件夹 C:\Windows\Installer 中,并将其重命名为随机名称(但保留 .msi 扩展名)。Windows 还在注册表中的HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\[InternalUserId]\Products\[some random guid-like sequence of chars identifying to windows your installation]\InstallProperties.
ValueName“LocalPackage”中创建一个键,此注册表键将指向重命名的 msi 文件。要在 C:\windows\Installer 中找到该文件,您可以在 Windows 资源管理器中导航到此文件夹,将其切换到“详细信息”视图,使“主题”列可见,您将看到所有 nnnnnnnn.msi 文件对应的产品名称。