Windows installer 卸载不会删除注册表项-如何查找原因

Windows installer 卸载不会删除注册表项-如何查找原因,windows-installer,Windows Installer,我已经为一个产品构建了一个安装项目(VisualStudio2010中的vdproj)。在我的测试机器上卸载时,它不会删除它应该删除的所有内容。具体来说,它不会删除在安装中创建的一些注册表项 一个类似的项目进行清理;我比较了这些项目,没有发现任何错误,所以我认为windows installer认为这是有充分理由的。我需要让他忘记原因,这样我就可以在不重新安装windows的情况下为我的产品获得一个干净的测试库 所以我尝试了手动清理: -卸载->注册表项不会被删除 -regedit->手动清理

我已经为一个产品构建了一个安装项目(VisualStudio2010中的vdproj)。在我的测试机器上卸载时,它不会删除它应该删除的所有内容。具体来说,它不会删除在安装中创建的一些注册表项

一个类似的项目进行清理;我比较了这些项目,没有发现任何错误,所以我认为windows installer认为这是有充分理由的。我需要让他忘记原因,这样我就可以在不重新安装windows的情况下为我的产品获得一个干净的测试库

所以我尝试了手动清理: -卸载->注册表项不会被删除 -regedit->手动清理 -安装->注册表项由我的MSI创建 -卸载->注册表项仍未删除

我认为在安装程序数据库的某个地方有一个(可能已经过时)的引用,它说:包含这些条目的组件仍然被该功能使用,因此您不能删除它们。也许我有重复的组件键,因为我复制了一个安装项目,所以我得到了这种混乱


我想我可能能够找到我的注册表项所属的组件和功能ID,但是如何在安装程序数据库中修复这个问题?我要去哪里看?有什么工具可以帮我吗?这是Windows7Ultimate。

混合的组件ID可能导致这种情况,是的。您可以运行这样的vbscript来标识所有组件ID及其产品所有者,使其成为vbs文件。另一个原因可能是您曾经将其标记为永久。这是对象上的一个系统设置,而不仅仅是构建时的项目设置,因此,如果安装了永久true,它将保持安装状态

当它将guid、所有者和路径写入文件时,如果是注册表路径,它将以2位数字开始,以表示注册表位置

Option Explicit
Public installer, fullmsg, comp, a, prod, fso, pname, ploc, pid, psorce

Set fso = CreateObject("Scripting.FileSystemObject")
Set a = fso.CreateTextFile("comps.txt", True)

' Connect to Windows Installer object
Set installer = CreateObject("WindowsInstaller.Installer")

a.writeline ("MSI Components")

on error resume next

For Each comp In installer.components

   a.writeline (comp & " is used by the product:")

   for each prod in Installer.ComponentClients (comp) 

      pid = installer.componentpath (prod, comp) 

      pname = installer.productinfo (prod, "InstalledProductName")

      a.Writeline ("     " & pname & " " & prod & "and is installed at " & pid)

   Next

Next

Phil已经提供了一个非常好的答案,并提供了所需的调试信息。只想补充一点,我倾向于给有问题的组件一个新GUID,然后再试一次

只有当相关设置尚未启动且仅存在于测试计算机上时,才应执行此操作

(如果这样做有效,那是因为新的GUID认为它“拥有”注册表项,并在卸载时将其删除。类似这样的GUID更改会导致升级后缺少文件和设置-在这种情况下,更改GUID只是一种黑客行为,如果除您以外的任何人尚未使用安装程序,则您可以使用它-否则永远不应该这样做)

下面是描述组件guid问题的另一个答案。应在何时更改,原因和后果: