1

这看起来真的很奇怪。我安装了一个程序(通过 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 ===
4

2 回答 2

3

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

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


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

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

产品代码:您可以使用此处描述的方法之一 找到安装的所有产品的产品代码和产品名称:如何找到已安装的 MSI 设置的产品 G​​UID?也许试试 PowerShell one-liner 或 VBScript。

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

卸载:这里有几种卸载 MSI 软件包的方法: 从命令行卸载 MSI 文件而不使用 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

类似的答案

于 2019-02-14T20:13:03.140 回答
0

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

于 2019-02-25T19:41:29.887 回答