如何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在某些机器上,脚本总是比使用工具多一点)。
-
我们从一个内置的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产品代码 :
- 启动
-
接下来,您可以尝试一个定制的,function更齐全的WMI工具,如
WMIExplorer.exe
- 这不包括在Windows中。 不过,这是一个非常好的工具。 推荐的。
- 查看: https : //github.com/vinaypamnani/wmie2/releases
- 启动该工具,单击连接,双击ROOT \ CIMV2
- 从“ 查询选项卡 ”中,input以下查询
SELECT IdentifyingNumber,Name,Version FROM Win32_Product
,然后按执行。 - 跳过屏幕截图,应用程序需要太多屏幕的房地产。
-
最后,您可以尝试使用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)从应用程序中访问此信息。 甚至可以像使用
PowerShell
,wbemtest.exe
或WMIExplorer.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