这似乎很奇怪。我已经安装了一个程序(通过WiX安装程序),并且试图以编程方式(使用c#)将其卸载,所以我使用了msiexec.exe / x {product-code-GUID}。该程序已卸载,但仍显示在控制面板中(添加/删除程序)。当我在注册表中查看时,我在HKLM \ SOFTWARE \ WOW6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall \下看到该程序,但是该产品作为其产品代码不在GUID下。它在.msi中甚至不存在的看似随机的GUID下。有谁知道为什么以及如何知道GUID是什么,以便可以通过编程方式将其删除?
我想我可以安装需要卸载的每个版本,并检查注册表并使用其中的GUID。可以,但是我想了解为什么GUID与产品代码不匹配。
UPDATE PT 2-15-19 9:21 am:
好-我记录了卸载,这是日志的结尾。它似乎已成功完成,但仍出现在“控制面板”中:
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 ===
答案 0 :(得分:3)
实际解决方案 (调试后):
运行:
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,您还需要卸载该MSI 摆脱ARP的所有障碍。
这里是一个VBScript,用于显示 LocalPackage路径(在桌面上创建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
相似答案 :
答案 1 :(得分:0)
解决方案是运行C:\ ProgramData \ Package Cache { Product-GUID } \ ProductSetup.exe / uninstall / quiet。尽管stein并未在another post的上方直接回答这个问题,所以我正在“结束”并给予他荣誉。