【问题标题】:After using msiexec to uninstall a program it remains in the control panel (add/remove programs)使用 msiexec 卸载程序后,它仍保留在控制面板中(添加/删除程序)
【发布时间】:2019-02-14 19:41:04
【问题描述】:

这看起来很奇怪。我安装了一个程序(通过 WiX 安装程序),我正在尝试以编程方式卸载它(使用 c#),所以我使用 msiexec.exe /x{product-code-GUID}。该程序已卸载,但仍显示在控制面板中(添加/删除程序)。当我查看注册表时,我在 HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ 下看到了该程序,但它不在该产品作为其产品代码的 GUID 下。它位于一个看似随机的 GUID 下,甚至在 .msi 中都不存在。任何人都知道为什么以及如何知道 GUID 是什么,以便我可以通过编程方式将其删除?

我想我可以安装我需要卸载的每个版本并检查注册表并使用那里的 GUID。这会起作用,但我想了解为什么 GUID 与产品代码不匹配。


太平洋时间 2-15-19 上午 9:21 更新:

好的 - 我记录了卸载,这里是日志的结尾。它似乎已经成功完成,但它仍然出现在控制面板中:

MSI (s) (10:E4) [09:16:22:812]: Note: 1: 1724 
MSI (s) (10:E4) [09:16:22:812]: Product: Product Name -- Removal completed successfully.

MSI (s) (10:E4) [09:16:22:812]: Windows Installer removed the product. 
Product Name: Product Name. Product Version: 1.21.4. Product Language: 1033. 
Manufacturer: . Removal success or error status: 0.

MSI (s) (10:E4) [09:16:22:870]: Deferring clean up of packages/files, if any 
exist
MSI (s) (10:E4) [09:16:22:870]: MainEngineThread is returning 0
MSI (s) (10:80) [09:16:22:871]: RESTART MANAGER: Session closed.
MSI (s) (10:80) [09:16:22:871]: No System Restore sequence number for this 
installation.
=== Logging stopped: 2/15/2019  9:16:22 ===
MSI (s) (10:80) [09:16:22:892]: User policy value 'DisableRollback' is 0
MSI (s) (10:80) [09:16:22:892]: Machine policy value 'DisableRollback' is 0
MSI (s) (10:80) [09:16:22:892]: Incrementing counter to disable shutdown. 
Counter after increment: 0
MSI (s) (10:80) [09:16:22:892]: Note: 1: 1402 2: 



HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\Rollback\Scripts 3: 2 
MSI (s) (10:80) [09:16:22:894]: Note: 1: 2265 2:  3: -2147287035 
MSI (s) (10:80) [09:16:22:894]: Note: 1: 1402 2: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\Rollback\Scripts 3: 2 
MSI (s) (10:80) [09:16:22:894]: Decrementing counter to disable shutdown. If counter >= 0, shutdown will be denied.  Counter after decrement: -1
MSI (s) (10:80) [09:16:22:894]: Post-install cleanup: removing installer file 'C:\Windows\Installer\c8de6843.msi'
MSI (s) (10:80) [09:16:22:896]: Post-install cleanup: removing installer file 'C:\Windows\Installer\{2DE751D3-33F4-4C3E-BD12-63E7F7F0A3C9}\icon.ico'
MSI (s) (10:80) [09:16:22:896]: Post-install cleanup: removing installer folder 'C:\Windows\Installer\{2DE751D3-33F4-4C3E-BD12-63E7F7F0A3C9}\' (if empty)
MSI (s) (10:80) [09:16:22:896]: Note: 1: 2318 2:  
MSI (s) (10:80) [09:16:22:897]: Destroying RemoteAPI object.
MSI (s) (10:B4) [09:16:22:897]: Custom Action Manager thread ending.
MSI (c) (78:7C) [09:16:22:898]: Decrementing counter to disable shutdown. If counter >= 0, shutdown will be denied.  Counter after decrement: -1
MSI (c) (78:7C) [09:16:22:898]: MainEngineThread is returning 0
=== Verbose logging stopped: 2/15/2019  9:16:22 ===

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    实际解决方案(调试后):

    运行:C:\ProgramData\Package Cache{Product-GUID}\ProductSetup.exe /uninstall /quiet


    重复安装:您可能有重复安装。除非您在卸载过程中不小心打开了“添加/删除程序”小程序,在这种情况下,您应该关闭并重新打开它以验证该条目是否仍然存在。

    “噪音”:您还可能会遇到一个问题,即存在的软件包过多而无法看到您的 setup.exe 已作为两个单独的 MSI 安装 文件。为防止这种情况,请在干净的虚拟机上进行测试并检查添加 / 删除程序列表以及其他相关条目。

    产品代码:您可以使用此处描述的方法之一找到所有安装的产品的产品代码和产品名称: How can I find the product GUID of an installed MSI setup? 不妨试试 PowerShell 单行程序或 VBScript。

    回滚:请注意,如果在卸载期间自定义操作失败,MSI 可以回滚其卸载。这意味着回滚 成为重新安装或至少恢复 卸载已删除。因此,在这种情况下,卸载似乎已运行,但由于自定义操作失败,产品已恢复。所以卸载永远不会“提交”。

    卸载:这里有几种卸载 MSI 软件包的方法:Uninstalling an MSI file from the command line without using msiexec。当您卸载所有条目后,我希望 ARP 条目消失。这是你自己的包裹吗?作为快速测试周期的副产品,重复安装在这种情况下非常常见。


    打包的 GUID:您在注册表中找到的 GUID 通常是打包的,或者换句话说,与您的 MSI 中的格式不同。

    示例 GUID 转换:

    HKEY_CLASSES_ROOT\Installer\Products
    
    Packed GUID: 0076C0A639AEC2738817CDFC311D064A
    Normal GUID: {6A0C6700-EA93-372C-8871-DCCF13D160A4}
    

    这里有更多细节:

    后一个链接有一个 VBScript 可以将打包的 GUID 转换为普通的 GUID。


    LocalPackage:安装 MSI 时,所有系统上都会缓存一个本地包。它将位于 %SystemRoot%\Installer。您可以使用它来定位文件,然后您可以在 Windows 资源管理器中右键单击它并选择“卸载”。

    这里的想法不是将此作为您的主要方法,而是 确定是否存在您还需要卸载的隐藏 MSI 摆脱 ARP 的一切。

    这是一个显示LocalPackage路径的VBScript(在桌面上创建VB脚本文件,保存并双击。寻找输出msiinfo.csv - 双击并导入到 Excel 或等效的 - 或记事本):

    ' Retrieve all ProductCodes (with ProductName and ProductVersion)
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set output = fso.CreateTextFile("msiinfo.csv", True, True)
    Set installer = CreateObject("WindowsInstaller.Installer")
    
    output.writeline ("Product Code,Product Name,Product Version,Local Package")
    
    On Error Resume Next ' we ignore all errors
    
    For Each product In installer.ProductsEx("", "", 7)
       productcode = product.ProductCode
       name = product.InstallProperty("ProductName")
       version=product.InstallProperty("VersionString")
    
       local=product.InstallProperty("LocalPackage")
    
       output.writeline (productcode & ", " & name & ", " & version & ", " & local)
    Next
    
    output.Close
    

    类似的答案

    【讨论】:

    • 谢谢,但这并没有真正起作用。我运行了文章中描述的 PowerShell 实用程序,它显示的 GUID 与我在 Orca 中看到的产品代码相同,但这与 HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall 下显示的 GUID 不同为什么它仍然显示在控制面板中。当我删除该注册表项时,它会从 CP 中消失。
    • 您绝不能从这些键中删除任何内容。这些密钥是 MSI 数据库的内部结构,很容易损坏。您可以做的是运行一个 VBScript,它会向您显示 %SystemRoot%\Installer 文件夹中本地缓存的 MSI 的路径,然后您就可以看到更多详细信息。让我们看看它是否仍然存在,我将在答案中添加一个 VBScript。
    • 感谢脚本。从命令行卸载后,GUID 不会出现在列表中,但它仍位于注册表(和控制面板中)的三个位置:HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\、HKLM\ SOFTWARE\Classes\Installer\Dependencies 和 HKCR\Installer\Dependencies。所以我的计划是在卸载后以编程方式删除这三个条目。 (实际上有 6 个条目 - 3 个带有原始 GUID,3 个带有其他 GUID,我不知道它来自哪里。
    • 您不能像在 MSI 数据库键中那样在注册表中四处寻找。您可能会破坏 Windows 或恶意软件保护软件或类似软件中的真实、跳闸保护机制。既然您以编程方式说,您是否打算在许多 PC 上执行此操作?
    • 是的 - 许多电脑。我们所有的客户。我还有什么选择?安装程序需要在安装新版本之前卸载以前的版本,如果我不能以编程方式执行此操作,那么旧版本仍将出现在控制面板中,这是不可接受的。我可以保留 HKLM\SOFTWARE\ 下的条目以外的所有内容WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ 因为这似乎是它出现在控制面板中的触发器。
    【解决方案2】:

    解决方案是运行 C:\ProgramData\Package Cache{Product-GUID}\ProductSetup.exe /uninstall /quiet。虽然 stein 没有直接在上面回答这个问题,但他在 another post 中回答了这个问题,所以我“关闭”这个并给予他信任。

    【讨论】:

      猜你喜欢
      • 2015-05-07
      • 1970-01-01
      • 2010-12-18
      • 2010-10-02
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多