繁体   English   中英

如何找到已安装 MSI 设置的产品 G​​UID?

[英]How can I find the product GUID of an installed MSI setup?

我需要为已安装的 MSI 文件找到产品 GUID ,以便执行patchinguninstall卸载方法)等维护以及auditing purposes

对于升级代码检索: 如何找到已安装 MSI 文件的升级代码?


精简版

下面的信息随着时间的推移而显着增加,并且可能变得有点过于复杂。 如何快速获取产品代码? (四种方法):

1 - Use the Powershell "one-liner"

向下滚动屏幕截图和分步操作 免责声明也在下面 - 轻微或中等风险取决于您询问的人。 对我来说工作正常。 由该选项触发的任何自我修复通常应该可以取消。 不过,触发的包完整性检查确实会增加一些事件日志“噪音”。 注意 IdentifyingNumberProductCode (WMI 特性)。

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

Powershell 快速启动:按住Windows 键,点击R ,输入“powershell”并按Enter

2 - Use VBScriptgithub.com 上的脚本- html 导出版本

下文在“替代工具”(第 3 节)下描述。 由于下面详细解释的原因,此选项可能比 Powershell更安全 它在本质上是触发MSI自我修复,因为它没有经过WMI的(多)更快,不能够(它访问MSI COM API直接-在起泡速度)。 但是,它比 Powershell 选项(几行代码)更复杂

3 - Registry Lookup

有些人发誓在注册表中查找内容。 不是我推荐的方法 - 我喜欢使用适当的 API(或者换句话说:操作系统函数调用)。 总有一些奇怪的异常只由 API 实现的内部来解释:

  • HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall
  • HKLM\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall
  • HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall

4 - Original MSI File / WiX Source

您可以在任何 MSI 文件(以及任何其他属性)的Property table中找到Product Code 但是,GUID 可能(很少)被安装时应用的转换覆盖,因此与产品注册的 GUID 不匹配(上面的方法 1 和 2 将报告真实的产品代码 - 即在 Windows 中注册 - 在这样的情况下)罕见的场景)。

您需要一个工具来查看 MSI 文件 有关您可以下载的免费工具列表(或查看下面的快速选项),请参阅以下答案的底部: 如何比较两个(或多个)MSI 文件的内容?

更新:为了方便和需要速度:-),从这个直接下载热链接毫不拖延地下载SuperOrca - 该工具足以完成工作 - 安装,打开 MSI 并直接进入属性表并找到ProductCode行(请始终对直接下载的热链接进行病毒检查 - 显然- 您可以使用virustotal.com来执行此操作 - 利用数十种防病毒和恶意软件套件进行在线扫描来扫描您上传的内容)。

Orca是 Microsoft 自己的工具,它与Visual StudioWindows SDK一起安装。 尝试在Program Files (x86)下搜索Orca-x86_en-us.msi ,如果找到则安装 MSI。

  • 当前路径C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.17763.0\\x86
  • 根据需要更改版本号

在下面你会找到“有机地成长”成很多细节的原始答案。

如果这是您需要执行的任务,请参阅下面的“卸载 MSI 软件包”部分。


检索产品代码

更新:如果您还需要升级代码,请查看此答案: 如何找到已安装 MSI 文件的升级代码? (在表输出中检索关联的产品代码、升级代码和产品名称 - 类似于下面的)。

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

启动Powershell按住 Windows 键,点击 R,松开 Windows 键,输入“powershell”并按 OK )并运行以下命令以获取已安装的 MSI 包产品代码列表以及本地缓存包路径产品名称(最大化 PowerShell 窗口以避免名称被截断)。

在运行此命令行之前,请阅读下面的免责声明(没有危险,只是一些潜在的麻烦)。 “替代工具”下的第 3 节显示了使用 VBScript 获取相同信息的替代非 WMI 方法。 如果您尝试卸载软件包,下面有一个部分包含一些示例 msiexec.exe 命令行:

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

输出应与此类似:

在此处输入图片说明

笔记! 出于某种奇怪的原因, “ProductCode 在 WMI 中被称为“IdentifyingNumber” 所以换句话说 - 在上面的图片中,IdentifyingNumberProductCode。

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

免责声明(重要,请在运行命令之前阅读!):由于奇怪的 Microsoft 设计,对Win32_Product任何 WMI 调用(如下面的 PowerShell 命令)都将触发资产的验证 除了速度很慢之外,这在极少数情况下还会触发 MSI 自我修复。 这可以是一个小包,也可以是大包——比如 Visual Studio。 在大多数情况下,这不会发生 - 但存在风险。 不要在重要会议之前运行此命令 - 它从来没有危险(它是只读的),但在极少数情况下可能会导致长时间修复(我认为您也可以取消自我修复 -除非有问题的包主动阻止,但如果您再次调用 Win32_Product 它将重新启动,这将持续到您让自我修复完成 - 有时即使您让它完成它也可能继续: 我如何确定是什么原因导致重复Windows Installer 自行修复? )。

并且只是为了记录: 有些人报告他们的事件日志充满了 MsiInstaller EventID 1035 条目(请参阅代码主管的答案)-显然是由 WMI 对 Win32_Product 类的查询引起的(我个人从未见过这个)。 这与上面建议的 Powershell 命令没有直接关系,它是在 WIM 类 Win32_Product 的一般使用上下文中。

您还可以以列表形式(而不是表格)获取输出:

get-wmiobject -class Win32_Product

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

在此处输入图片说明


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

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

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

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

此外,WMI 中的远程连接(至少)受Windows 防火墙DCOM 设置用户帐户控制 (UAC) (加上任何其他非 Microsoft 因素 - 例如真实防火墙第三方软件防火墙各种安全软件的影响)。种类等...)。 它是否有效取决于您的确切设置。

更新:可以在此答案中找到有关远程 WMI 运行的广泛部分: 如何找到已安装 MSI 文件的升级代码? . 看来防火墙规则和通过注册表调整抑制 UAC 提示可以使工作组网络环境中的工作正常进行。 不建议在安全方面进行更改,但它对我有用。


替代工具

PowerShell需要安装.NET 框架(目前似乎是 3.5.1 版?2017 年 10 月)。 即使安装了 .NET,计算机中也可能缺少实际的 PowerShell 应用程序本身。 最后,我相信 PowerShell 可以被各种系统策略和权限禁用或锁定

如果是这种情况,您可以尝试其他几种方法来检索产品代码。 我的首选替代方案是VBScript - 它快速且灵活(但也可以锁定在某些机器上,并且脚本编写总是比使用工具多一点)。

  1. 让我们从内置的 Windows WMI 工具开始wbemtest.exe
  • 启动wbemtest.exe按住 Windows 键,点击 R,松开 Windows 键,输入“wbemtest.exe”并按 OK )。
  • 单击连接,然后单击确定(命名空间默认为 root\\cimv2),然后再次单击“连接”。
  • 单击“查询”并输入此WQL 命令(SQL 风格): SELECT IdentifyingNumber,Name,Version FROM Win32_Product并单击“使用”(或等效的 - 该工具将被本地化)。
  • 示例输出屏幕截图(已截断)。 不是最好的格式,但您可以获得所需的数据。 IdentificationNumber 是 MSI 产品代码

测试程序

  1. 接下来,您可以尝试自定义的、功能更全面的 WMI 工具,例如WMIExplorer.exe
  • 这不包括在 Windows 中。 然而,它是一个非常好的工具。 受到推崇的。
  • 查看: https : //github.com/vinaypamnani/wmie2/releases
  • 启动工具,点击连接,双击ROOT\\CIMV2
  • 在“查询选项卡”中,输入以下查询SELECT IdentifyingNumber,Name,Version FROM Win32_Product并按 Execute。
  • 屏幕截图已跳过,应用程序需要太多的屏幕空间。
  1. 最后,您可以尝试使用VBScript通过MSI 自动化界面访问信息(Windows 的核心功能 - 它与 WMI 无关)。
  • 复制以下脚本并粘贴到桌面上的 *.vbs 文件中,然后尝试通过双击运行它。 您的桌面必须是可写的,或者您可以使用任何其他可写位置。
  • 这不是一个很棒的 VBScript。 简洁优于错误处理和完整性,但它应该以最小的复杂性完成工作。
  • 输出文件在您运行脚本的文件夹中创建(文件夹必须是可写的)。 输出文件称为msiinfo.csv
  • 双击要在电子表格应用程序中打开的文件,在导入时选择逗号作为分隔符 - 或者 - 只需在记事本或任何文本查看器中打开文件。
  • 在电子表格中打开将允许高级排序功能。
  • 该脚本可以很容易地进行调整,以显示有关 MSI 安装的大量详细信息 可以在此处找到对此的演示: 如何找出安装了哪些产品 - 较新的产品已安装 MSI windows
' 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")

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)从您的应用程序中访问此信息。 或者甚至在您的应用程序中使用 WMI 查询,就像您在上面的示例中使用PowerShellwbemtest.exeWMIExplorer.exe


卸载 MSI 软件包

如果您想要做的是卸载您找到产品代码的 MSI 包,您可以使用提升的命令提示符执行以下操作(搜索cmd.exe ,右键单击并以 admin 身份运行):

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

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

快速参数说明:

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

如果您愿意,您还可以启用(详细)日志记录并以静默模式运行,从而引导我们选择选项 2:

选项 2使用详细日志记录静默卸载(更适合批处理文件):

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

快速参数说明:

/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
REBOOT=ReallySuppress = avoid unexpected, sudden reboot

这里有关于 MSI 卸载综合参考(卸载 MSI 包的各种不同方法): Uninstalling an MSI file from the command line without using msiexec 有很多不同的卸载方法。

如果您正在编写批处理文件,请查看上面的第 3 部分,一些常见和标准卸载命令行变体的链接答案。

以及指向msiexec.exe(命令行选项)的快速链接 MSDN 中 msiexec.exe 的命令行概述)。 还有Technet版本


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

更新:请找到有关如何查找已安装软件包的升级代码的新答案,而不是在 MSI 文件中手动查找代码。 对于已安装的软件包,这更加可靠。 如果没有安装该软件包,您仍然需要在MSI文件(或用于编译MSI的源文件)中查找升级代码。 离开下面的旧部分:

如果您想获取UpgradeCode其他 MSI 属性,您可以从上图中LocalPackage ”指定的位置打开产品的缓存安装 MSI(类似于: C:\\WINDOWS\\Installer\\50c080ae.msi -它是一个十六进制文件名,在每个系统上都是唯一的)。 然后您查看 UpgradeCode 的“属性表”(有可能在转换中重新定义 UpgradeCode - 确保您获得从系统以编程方式检索代码所需的正确值 - 我将为这很快。但是,在缓存的 MSI 中找到的 UpgradeCode 通常是正确的)。

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

更新:这是一个新答案,其中包含有关可用于查看 MSI 文件的各种免费产品的信息: 如何比较两个(或多个)MSI 文件的内容?

如果您安装了 Visual Studio ,请尝试在Program Files (x86)下搜索Orca-x86_en-us.msi并安装它(这是 Microsoft 自己的官方 MSI 查看器和编辑器)。 然后在开始菜单中找到 Orca。 马上去吧:-)。 从技术上讲,Orca 是作为 Windows SDK(不是 Visual Studio)的一部分安装的,但 Windows SDK 与 Visual Studio 安装捆绑在一起。 如果您没有安装 Visual Studio ,也许您认识安装的人? 只需让他们搜索此 MSI 并将其发送给您(这是一个半 mb 的小文件)- 应该花他们几秒钟的时间。 更新:您需要多个 CAB 文件以及 MSI - 这些文件位于找到 MSI 的同一文件夹中。 如果没有,您可以随时下载Windows SDK (它是免费的,但它很大 - 您安装的所有内容都会降低您的 PC 速度)。 我不确定 SDK 的哪一部分安装了 Orca MSI。 如果您这样做,请在此处编辑和添加详细信息。



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

如果您有太多的安装程序而无法轻松找到您要查找的内容,这里有一些 powershell 可以提供过滤器并按显示名称缩小范围。

$filter = "*core*sdk*"; (Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall).Name | % { $path = "Registry::$_"; Get-ItemProperty $path } | Where-Object { $_.DisplayName -like $filter } | Select-Object -Property DisplayName, PsChildName

还有一个非常有用的 GUI 工具,称为 Product Browser,它似乎是由 Microsoft 或至少是 Microsoft 的员工制作的。

它可以在 Github 上找到,这里是Product Browser

我个人很容易找到我需要的 GUID。

你可以看看MSI Finder 它允许您按名称、GUID 或位置搜索产品或组件,查看其属性,以及修复或卸载单个产品。

免责声明:我一直在寻找类似的解决方案,但找不到任何可靠或易于使用的方法。 所以,我开发了这个工具。

我没有足够的 Rep 点数来直接回复 Stein Asmul,也许有人可以给他发消息,但这是我从 VBScript 解决方案改编的 powershell one-liner,我发现它比现有的 powershell one-liner 更可靠,特别是在以非管理员身份运行时,速度要快得多

$Installer = New-Object -ComObject WindowsInstaller.Installer; $InstallerProducts = $Installer.ProductsEx("", "", 7); $InstalledProducts = ForEach($Product in $InstallerProducts){[PSCustomObject]@{ProductCode = $Product.ProductCode(); LocalPackage = $Product.InstallProperty("LocalPackage"); VersionString = $Product.InstallProperty("VersionString"); ProductPath = $Product.InstallProperty("ProductName")}} $InstalledProducts

专业提示:将 7 更改为 3 以查找潜伏在每个用户安装而不是机器范围内的程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM