如何find已安装的MSI安装程序的产品GUID?

我需要find已安装的MSI文件产品GUID ,以便执行修补,卸载和审计等维护。

检索产品代码

更新 :如果您还需要升级代码 ,请检查以下答案: 如何find已安装的MSI文件的升级代码? (检索表格输出中的相关产品代码,升级代码和产品名称 – 类似于下面的代码)。

  • 不能使用PowerShell? 请参阅下面的“替代工具”部分。
  • 想卸载? 请参阅下面的“卸载MSI软件包”部分。

启动Powershell按住Windows键,点击R键,释放Windows键,input“powershell”,然后按OK键 ),然后运行以下命令以获取已安装的MSI软件包产品代码列表以及本地caching软件包path 产品名称 (最大化PowerShell窗口以避免截断名称)。

在运行这个命令行之前,请阅读下面的免责声明(没有危险,只是一些潜在的麻烦)。 如果您试图卸载软件包,下面有一些示例msiexec.exe命令行:

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize 

输出应该类似于这个:

在这里输入图像描述

注意! 出于某种奇怪的原因, “ProductCode 在WMI中被称为“IdentifyingNumber” 。 换句话说,在上面的图片中,IdentifyingNumber ProductCode。

如果您需要远程运行此查询 ,请参阅下面的“ 从远程计算机检索产品代码 ”一节。

免责声明 (重要的是,请在运行命令之前阅读!):由于微软的奇怪devise,任何对Win32_Product WMI调用(如下面的PowerShell命令)都会触发对软件包属性的validation 。 除了相当缓慢之外 ,这种情况在极less数情况下可能会引发MSI的自我修复。 这可以是一个小软件包,也可以是一个很大的东西,比如Visual Studio。 在大多数情况下,这不会发生 – 但是存在风险。 不要在重要会议之前运行这个命令 – 它不是危险的(它是只读的),但在极less数情况下可能会导致长时间的修复 (我认为你也可以取消自我修复 -除非有问题的软件包主动阻止它,但是如果你再次调用Win32_Product,它将会重新启动,直到你完成自我修复 – 有时候它可能会继续,即使你完成了它: 我怎样才能确定是什么原因导致重复Windows安装程序自我修复? )。

只是为了logging: 有些人报告他们的事件日志填满了MsiInstaller EventID 1035条目 (见代码首席的答案) – 显然是由WMI查询到Win32_Product类(个人我从来没有见过这个)造成的。 这与上面build议的Powershell命令没有直接关系,它是在WIM类Win32_Product的一般使用的上下文中。

您也可以以列表forms(而不是表格)获得输出结果:

 get-wmiobject -class Win32_Product 

在这种情况下,输出与此类似:

在这里输入图像描述


从远程计算机检索产品代码

理论上你应该能够指定远程计算机名称作为命令本身的一部分。 这里是与上面设置的在“RemoteMachine”机器上运行的相同的命令( -ComputerName RemoteMachine部分添加):

 get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize 

如果您在正确的域上运行域pipe理员权限,这可能会起作用。 在工作组环境(小型办公室/家庭networking)中,您可能必须将用户凭据直接添加到WMI调用以使其工作。

此外,WMI中的远程连接还受(至less) Windows防火墙DCOM设置用户帐户控制(UAC) (以及任何其他非Microsoft因素 – 例如真实防火墙第三方软件防火墙各种安全软件种类等)。 它是否工作取决于你的确切设置。

  • 设置远程WMI连接
  • 使用PowerShell远程连接到WMI

更新 :关于远程WMI运行的一个广泛部分可以在这个答案中find : 如何find已安装的MSI文件的升级代码? 。 它出现了一个防火墙规则,通过registry调整抑制UAC提示可以使事情在工作组networking环境中工作。 不build议更改安全性,但它对我有效。


替代工具

PowerShell需要安装.NET框架 (目前版本为3.5.1,看起来像2017年10月)。 即使安装了.NET,实际的PowerShell应用程序本身也可能从机器中丢失 。 最后我相信PowerShell可以被各种系统策略和权限禁用或locking

如果是这种情况,您可以尝试其他方法来检索产品代码。 我最喜欢的select是VBScript – 它是快速和灵活的(但也可以locking在某些机器上,脚本总是比使用工具多一点)。

  1. 我们从一个内置的Windows WMI工具开始wbemtest.exe

    • 启动wbemtest.exe按住Windows键,点击R键,释放Windows键,input“wbemtest.exe”,然后按OK键 )。
    • 单击连接 ,然后确定 (命名空间默认为root \ cimv2),然后再次单击“ 连接 ”。
    • 点击“ 查询 ”并input这个WQL命令 (SQL flavor): SELECT IdentifyingNumber,Name,Version FROM Win32_Product然后单击“使用”(或等价的 – 工具将被本地化)。
    • 示例输出截图(截断)。 不是最好的格式,但你可以得到你需要的数据。 IdentifyingNumber是MSI产品代码

WBEMTEST.EXE

  1. 接下来,您可以尝试一个定制的,function更齐全的WMI工具,如WMIExplorer.exe

    • 这不包括在Windows中。 不过,这是一个非常好的工具。 推荐的。
    • 查看: https : //github.com/vinaypamnani/wmie2/releases
    • 启动该工具,单击连接,双击ROOT \ CIMV2
    • 从“ 查询选项卡 ”中,input以下查询SELECT IdentifyingNumber,Name,Version FROM Win32_Product ,然后按执行。
    • 跳过屏幕截图,应用程序需要太多屏幕的房地产。
  2. 最后,您可以尝试使用VBScript通过MSI自动化界面访问信息(Windows的核心function – 与WMI无关 )。

    • 复制下面的脚本并粘贴到桌面上的* .vbs文件中,并尝试通过双击运行它。 您的桌面必须是可写的,或者您可以使用任何其他可写位置。
    • 这不是一个伟大的VBScript。 Terseness比error handling和完整性更受欢迎 ,但它应该以最小的复杂性完成工作。
    • 输出文件是在运行脚本的文件夹中创build的( 文件夹必须是可写的 )。 输出文件被称为msiinfo.txt
 Set fso = CreateObject("Scripting.FileSystemObject") Set output = fso.CreateTextFile("msiinfo.txt", True) Set installer = CreateObject("WindowsInstaller.Installer") 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") output.writeline (productcode & ", " & name & ", " & version) Next output.Close 

现在我想不出有什么进一步的通用选项来检索产品代码了,如果您知道的话请添加。 只需内联编辑,而不是添加太多的评论。

您当然可以通过调用MSI自动化接口 (基于COM)或C ++ MSI安装程序函数 (Win32 API)从应用程序中访问此信息。 甚至可以像使用PowerShellwbemtest.exeWMIExplorer.exe在上面的示例中那样从应用程序中使用WMI查询。


卸载MSI软件包

如果您想要卸载MSI软件包 ,您可以使用提升的命令提示符 (searchcmd.exe ,右键单击并以pipe理员身份运行 )执行以下操作:

选项1基本的交互式卸载,无需日志logging (快速简单):

 msiexec.exe /x {00000000-0000-0000-0000-00000000000C} 

快速参数说明:

 /X = run uninstall sequence {00000000-0000-0000-0000-00000000000C} = product code for product to uninstall 

您也可以启用(详细)日志logging并以静默方式运行(如果需要),引导我们select2:

选项2使用详细日志logging进行无提示卸载 (适用于batch file):

 msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" 

快速参数说明:

 /X = run uninstall sequence {00000000-0000-0000-0000-00000000000C} = product code for product to uninstall /QN = run completely silently /L*V "C:\My.log"= verbose logging at specified path 

这里有一个全面的MSI卸载参考 (卸载MSI软件包的各种不同方法): 从命令行卸载MSI文件,而不使用msiexec 。 有很多不同的方式来卸载。

如果您正在编写batch file,请参阅上面的第3节,链接了几个常用和标准卸载命令行变体的答案。

并快速链接到msiexec.exe(命令行选项) (从MSDN msiexec.exe命令行的概述)。 还有Technet版本


检索其他MSI属性/信息(f.ex升级代码)

更新 :请find一个新的答案如何find已安装的软件包的升级代码,而不是手动查找MSI文件中的代码。 对于已安装的软件包,这更可靠。 如果软件包没有安装,您仍然需要查看MSI文件(或用于编译MSI的源文件)来查找升级代码。 在以下较老的部分留下:

如果您想获取UpgradeCode其他MSI属性 ,您可以从上面的图像显示中的“ LocalPackage ”指定的位置打开该产品的caching安装MSI(如: C:\WINDOWS\Installer\50c080ae.msi -它是一个hex文件名,每个系统都是唯一的)。 然后,在“ 属性表 ”中查找UpgradeCode(UpgradeCode可以在转换中重新定义 – 为了确保您获得正确的值,您需要从系统中以编程方式检索代码 – 我将提供一个脚本但是, 在caching的MSI中find的UpgradeCode通常是正确的 )。

要打开caching的MSI文件,请使用Orca或其他打包工具。 这里是讨论不同的工具(他们中的任何一个都可以):使用什么样的安装产品? InstallShield,WiX,Wise,Advanced Installer等 。 如果你没有安装这样的工具,你最快的select可能是尝试Super Orca (使用简单,但没有经过我的广泛testing)。

如果您安装了Visual Studio ,请尝试searchOrca-x86_en-us.msi并安装它(这是Microsoft自己的官方MSI查看器和编辑器)。 然后在开始菜单中findOrca。 赶时间:-)。 技术上Orca是作为Windows SDK(不是Visual Studio)的一部分安装的,但是Windows SDK与Visual Studio安装捆绑在一起。 如果你没有安装Visual Studio ,也许你知道有人在做什么? 只要让他们search这个微星,并发送给你(这是一个很小的半个MB文件) – 应该花几秒钟。 如果没有的话,你可以随时下载Windows SDK (它是免费的,但是很大 – 你安装的所有东西都会让你的电脑变慢)。 我不确定SDK的哪个部分安装了Orca MSI。 如果你这样做,请在这里编辑和添加细节。


  • 下面是关于MSI卸载问题的更全面的文章: 从命令行卸载MSI文件而不使用msiexec
  • 这里有一个类似的文章, 有几个更多的选项来使用registry或caching的msi检索MSI信息: 从MSI文件中查找GUID ?

类似的主题(供参考和方便访问 – 我应该清理这个列表):

  • 如何在Win 7中find已安装应用程序的升级代码和产品代码
  • 如何在C#中find已安装应用程序的升级代码?
  • Wix:如何卸载以前安装的使用不同安装程序安装的应用程序
  • WiX – 对多实例安装进行重大升级
  • 如何找出哪些产品安装 – 新产品已经安装MSI窗口 (使用VBScript)
  • 如何使用产品id guid卸载msiexec而不存在.msi文件
  • 查找MSI包的GUID