powershell 如何找到已安装MSI安装程序的产品GUID?

wfveoks0  于 2023-03-23  发布在  Shell
关注(0)|答案(5)|浏览(285)

我需要找到安装的MSI文件产品GUID,以便进行**patchinguninstall如何卸载)等维护,以及auditing purposes**的维护。

b1payxdu

b1payxdu1#

升级码取数:如何找到已安装MSI文件的升级代码?or use the html table export script-如下面第2节所示)

短版本

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

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
更新:正如Alexis Coles所评论的那样,您可以跳过WMI并通过COM(更快):

$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

If you want the upgrade code, maybe use the html export instead(下文第2节)

2 - Use VBScriptscript on github.com - html export version

下面在“替代工具”下进行了说明(第3节)。此选项可能比Powershell更安全,原因如下所述。本质上,它是(快得多)更快,由于不通过WMI,因此无法触发MSI自我修复(它直接访问MSI COM API-以极快的速度)。* 然而,它比Powershell选项更复杂 *(几行代码)。

***********:html版本也会获得升级代码。它可以触发自我修复和过度日志记录。请参阅嵌入在script itself中的警告。通常它运行时没有问题,但需要一段时间才能完成。

3 - Registry Lookup

有些人发誓要在注册表中查找内容。这不是我推荐的方法-我喜欢通过适当的API(或者换句话说:OS函数调用)。总是有一些奇怪的异常,只由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,然后直接转到Property table并找到ProductCode行(请通过恶意软件检查运行下载-您可以使用virustotal.com执行此操作-在线扫描利用数十个防病毒和恶意软件套件来扫描您上传的内容)。
Orca是微软自带工具,随Visual StudioWindows SDK一起安装,请尝试搜索**Program Files (x86)下的Orca-x86_en-us.msi**,找到后安装MSI。
*当前路径一米十四分一秒

  • 根据需要更改路径末尾的版本号-很明显

下面你会发现原来的答案,其中“有机增长”成了很多细节。
如果您需要执行此任务,请参阅下面的“卸载MSI软件包”部分。

检索产品代码

UPDATE:如果您还需要升级代码,请勾选以下答案:如何找到已安装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自我修复?)。

只是为了记录在案:some people report their event logs filling up with MsiInstaller EventID 1035 entries(见代码主管的回答)-显然是由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因素-例如真实的防火墙第三方软件防火墙各种安全软件等...)的影响。是否有效取决于您的确切设置。

替代工具

PowerShell需要安装**.NET framework**(目前好像是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并单击“使用”(或等效工具-工具将被本地化)。
  • 输出截图示例(截短),格式不太好,但可以得到需要的数据。IdentifyingNumber为MSI产品代码

1.接下来,您可以尝试一个自定义的、功能更全面的WMI工具,如WMIExplorer.exe

  • 这不包括在Windows中。然而,它是一个非常好的工具。推荐。
  • 请访问:https://github.com/vinaypamnani/wmie2/releases
  • 启动该工具,单击“连接”,双击ROOT\CIMV2
  • 在【查询】选项卡中,输入以下查询SELECT IdentifyingNumber,Name,Version FROM Win32_Product,然后按执行。
  • 屏幕截图跳过,应用程序需要太多的屏幕真实的。

1.最后,您可以尝试使用VBScript通过MSI自动化界面(Windows的核心功能-它与WMI无关)访问信息。

  • 复制下面的脚本并粘贴到桌面上的 *.vbs文件中,然后双击运行它。您的桌面必须是可写的,或者您可以使用任何其他可写位置。

  • 这不是一个很好的VBScript。简洁性比错误处理和完整性更受欢迎,但它应该以最小的复杂性完成这项工作。

  • 输出文件在运行脚本的文件夹中创建(文件夹必须可写)。输出文件名为msiinfo.csv

  • 双击要在电子表格应用程序中打开的文件,在导入时选择逗号作为分隔符-或者-只需在记事本或任何文本查看器中打开文件。

  • 在电子表格中打开将允许高级排序功能。

  • 这个脚本可以很容易地修改为显示a significant amount of further details about the MSI installation。可以在这里找到演示:如何查找已安装产品-已安装较新产品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

我想不出任何进一步的通用选项来检索产品代码的时刻,请添加,如果你知道任何。只是编辑内联,而不是添加太多的意见,请。
当然,您可以通过调用the MSI automation interface(基于COM)或C++ MSI installer functions(Win32 API)从应用程序内部访问此信息,甚至可以像在上面的示例中使用PowerShellwbemtest.exeWMIExplorer.exe那样从应用程序内部使用WMI查询。

卸载MSI包

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

备选案文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包的方法):不使用msiexec从命令行卸载MSI文件。有很多不同的卸载方法。

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

还有一个到msiexec.exe (command line options)的快速链接(MSDN中msiexec.exe命令行的概述)。还有the Technet version

检索其他MSI属性/信息(例如升级代码)

更新:请找到如何找到已安装软件包的升级代码的新答案,而不是手动在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,请尝试搜索Orca-x86_en-us.msi-在Program Files (x86)下-并安装它(这是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。如果你这样做,请在这里编辑并添加细节。

  • 以下是关于MSI卸载问题的更全面的文章:不使用msiexec从命令行卸载MSI文件
  • 下面是一篇类似的文章,其中提供了一些进一步的选项,用于使用注册表或缓存的MSI检索MSI信息:Find GUID From MSI File

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

agyaoht7

agyaoht72#

我没有足够的Rep点数直接回复Stein Asmul,也许有人可以给他发消息,但这里有一个我从VBScript解决方案中改编的powershell一行程序,我发现它比现有的powershell一行程序更可靠,特别是当以非管理员身份运行时,而且速度更快

$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,以查找潜伏在每个用户安装而不是机器范围内的程序。

c8ib6hqw

c8ib6hqw3#

如果你有太多的安装程序,很难找到你要找的东西,这里有一些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
0md85ypi

0md85ypi4#

还有一个非常有用的GUI工具,称为产品浏览器,似乎是由微软或至少是微软的员工。
可以在Github上找到Product Browser
我个人有一个非常容易的时间找到GUID我需要与此。

h43kikqp

h43kikqp5#

您可以查看MSI Finder。它允许您按名称、GUID或位置搜索产品或组件,查看其属性,以及修复或卸载单个产品。
免责声明:我一直在寻找一个类似的解决方案,但找不到任何可靠或易于使用的。所以,我开发了这个工具。

相关问题