' 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
5条答案
按热度按时间b1payxdu1#
升级码取数:如何找到已安装MSI文件的升级代码?(or use the html table export script-如下面第2节所示)
短版本
下面的信息随着时间的推移而大大增加,可能已经变得有点过于复杂。如何快速获得产品代码?(四种方法):
1 -
Use the Powershell "one-liner"
IdentifyingNumber
是ProductCode
(WMI特性)。PowerShell快速入门:按住Windows键,点击R,键入“powershell”并按Enter
更新:正如Alexis Coles所评论的那样,您可以跳过WMI并通过COM(更快):
If you want the upgrade code, maybe use the html export instead(下文第2节)
2 -
Use VBScript
(script 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 Studio和Windows 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命令行:
输出应该类似于这样:
注意!由于某些奇怪的原因,“ProductCode”在WMI 中被称为“IdentifyingNumber”。换句话说-在上图中,IdentifyingNumber是ProductCode。
如果您需要针对大量远程计算机远程运行此查询,请参阅下面的“* 从远程计算机检索产品代码 *”部分。
免责声明(很重要,请在运行命令之前阅读!):由于奇怪的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的一般使用环境中。
您也可以以列表形式(而不是表格)获得输出:
在这种情况下,输出类似于:
从远程计算机检索产品代码
从理论上讲,您应该能够指定远程计算机名称作为命令本身的一部分。下面是与上面相同的命令,设置为在机器“RemoteMachine”上运行(添加了
-ComputerName RemoteMachine
部分):如果您在适当的域上使用域管理员权限运行,则可能会起作用。在工作组环境(小型办公室/家庭网络)中,您可能必须直接向WMI调用添加用户凭据才能使其起作用。
此外,WMI中的远程连接(至少)会受到Windows防火墙、DCOM设置和用户帐户控制(UAC)(以及任何其他非Microsoft因素-例如真实的防火墙、第三方软件防火墙、各种安全软件等...)的影响。是否有效取决于您的确切设置。
更新:在此回答中可以找到有关远程WMI运行的详细部分:如何找到已安装MSI文件的升级代码?。通过注册表调整,防火墙规则和UAC提示符的抑制似乎可以使工作组网络环境中的工作正常进行。不建议更改安全性,但它对我有效。
替代工具
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*)。SELECT IdentifyingNumber,Name,Version FROM Win32_Product
并单击“使用”(或等效工具-工具将被本地化)。1.接下来,您可以尝试一个自定义的、功能更全面的WMI工具,如
WMIExplorer.exe
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。
我想不出任何进一步的通用选项来检索产品代码的时刻,请添加,如果你知道任何。只是编辑内联,而不是添加太多的意见,请。
当然,您可以通过调用the MSI automation interface(基于COM)或C++ MSI installer functions(Win32 API)从应用程序内部访问此信息,甚至可以像在上面的示例中使用
PowerShell
、wbemtest.exe
或WMIExplorer.exe
那样从应用程序内部使用WMI查询。卸载MSI包
如果您想卸载您找到的产品代码的MSI包,可以使用提升的命令提示符(搜索cmd.exe,右键单击以管理员身份运行)执行以下操作:
备选案文1:无需日志记录的基本交互式卸载(快速简便):
快速参数说明:
如果需要,您还可以启用(详细)日志记录并在静默模式下运行,这将我们带到选项2:
备选案文2:使用详细日志记录的静默卸载(更适合批处理文件):
快速参数说明:
这里有一个MSI卸载的综合参考(各种不同的卸载MSI包的方法):不使用msiexec从命令行卸载MSI文件。有很多不同的卸载方法。
还有一个到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。如果你这样做,请在这里编辑并添加细节。类似的主题(供参考和方便访问-我应该清理这个列表):
agyaoht72#
我没有足够的Rep点数直接回复Stein Asmul,也许有人可以给他发消息,但这里有一个我从VBScript解决方案中改编的powershell一行程序,我发现它比现有的powershell一行程序更可靠,特别是当以非管理员身份运行时,而且速度更快
专业提示:将7更改为3,以查找潜伏在每个用户安装而不是机器范围内的程序。
c8ib6hqw3#
如果你有太多的安装程序,很难找到你要找的东西,这里有一些powershell提供一个过滤器,并通过显示名称缩小一点。
0md85ypi4#
还有一个非常有用的GUI工具,称为产品浏览器,似乎是由微软或至少是微软的员工。
可以在Github上找到Product Browser
我个人有一个非常容易的时间找到GUID我需要与此。
h43kikqp5#
您可以查看MSI Finder。它允许您按名称、GUID或位置搜索产品或组件,查看其属性,以及修复或卸载单个产品。
免责声明:我一直在寻找一个类似的解决方案,但找不到任何可靠或易于使用的。所以,我开发了这个工具。