- Win32_Product 允许您清点和卸载 MSI 软件,但它并不涵盖所有已安装的软件,并且并非没有副作用。
- PowerShell的 注册表(DisplayName 和 UninstallString)提供了更全面的程序列表和管理替代方案。
- MSI 产品的 GUID 是通过 Win32_Product 获取的,而其他安装程序则需要直接读取 UninstallString。
- 结合 WMI、日志记录和脚本,可以实现环境中的清单清点、卸载和代理验证的自动化。 Windows.

管理 Windows 中的软件清单 这是几乎没人愿意做,但迟早都要面对的任务之一,尤其是在你管理多个团队或不得不离开某些人的时候。 手提 生产环境“清洁”。在此背景下,WMI 类 Win32_产品 它通常是检查已安装应用程序、自动卸载和验证基于 MSI 的安装的快捷直接的方法。
然而,依靠 Win32_产品 如果对 Windows Installer 的底层工作原理缺乏全面了解,可能会导致一些意想不到的问题:从脚本运行严重延迟到 MSI 包被静默修复。此外,并非所有软件都通过 Windows Installer 安装,这使得库存管理和自动卸载变得更加复杂。在接下来的章节中,我们将详细介绍如何使用 Win32_Product,PowerShell 和注册表中有哪些替代方案,如何获取产品 GUID,以及如何在现代 Windows 环境中安全高效地运行脚本。
Win32_Product是什么?它提供哪些软件信息?
WMI类 Win32_产品 它是命名空间的一部分 root\cimv2 来自 WMI,旨在表示已安装的产品 Microsoft Windows Installer (MSI)通过查询,您可以获取系统中存在的 MSI 包的关键数据,例如名称、版本、供应商或产品标识符 (GUID),以及其他与管理相关的属性。
其中最有用的特性包括 Win32_产品 这些属性包括产品名称(Name)、版本号(Version)、供应商(Vendor)、产品标识符(IdentifyingNumber)和本地软件包位置(LocalPackage)。当您需要……时,这些属性尤其有用。 库存 MSI 软件检查已安装的关键应用程序的版本,或使用唯一标识符来卸载产品。 comandos 自动化。
必须明确的是 Win32_Product 仅返回使用 Windows Installer 安装的软件使用自定义安装程序、EXE 安装程序、其他打包应用程序或从 Microsoft Store 下载的软件安装的任何程序都不会出现在此类查询中。因此,虽然这是一个强大的工具,但它本身并不能涵盖计算机上的所有应用程序。
微软的技术文档引用了以下资源: TechNet 脚本中心 有关使用此 WMI 类及其他众多 WMI 类的脚本示例,请参阅以下资源。这些资源演示了使用各种脚本语言枚举、筛选、卸载和审核通过 MSI 安装的软件(包括本地和远程计算机)的实际用例。

运行 WMI 脚本以进行软件清单编制
尽管如今大多数管理者都倾向于 PowerShell的在许多情况下,微软的示例和经典文档仍然依赖于此。 VBScript 和 WMI软件清单脚本通常在本地计算机上运行,但稍作修改,如果权限和连接性足够,也可以针对远程计算机运行。
典型的微软指南解释了一个简单的操作步骤: 运行扩展名为 .vbs 的脚本一般流程包括编写以下代码: 脚本使用正确的扩展名保存它,然后从命令行运行它。 脚本这样,输出将保留在控制台中,而不会打开 Windows Script Host 图形界面。
运行这些脚本的基本流程包括复制示例代码并将其保存到类似这样的文件中。 名称.vbs (确保编辑器不会在末尾添加“.txt”),打开一个窗口 命令提示切换到脚本保存的目录,然后运行如下命令: cscript 名称.vbs这种方法既适用于只读取信息的脚本,也适用于执行卸载等操作的脚本。
重要的是要考虑到 访问某些资源需要权限如果脚本查询敏感信息,例如某些受保护的事件日志或受用户帐户控制 (UAC) 约束的系统区域,则可能需要以提升的权限(以管理员身份运行)打开控制台才能使其正常运行。
虽然许多示例都侧重于本地计算机,但微软的文档详细记录了如何 连接到远程计算机上的 WMI使用包含计算机名称和具有适当权限的凭据的连接字符串,可以扫描多台机器并集中收集软件信息,这在审计或大规模部署中非常有用。
使用 Win32_Product 卸载 MSI 软件
该系列最引人注目的能力之一 Win32_产品 它不仅可以列出已安装的 MSI 应用程序,而且 使用卸载方法卸载它们这样一来,无需手动通过控制面板,即可自动从数十台计算机中删除不需要的软件。
在 VBScript 中,典型的做法是连接到目标机器的 WMI 服务,对 Win32_Product 类运行查询并按产品名称进行筛选,然后通过调用方法遍历结果集合。 卸载() 在每个实例上执行此操作。这样,就可以静默删除使用 Windows Installer 安装的特定应用程序。
经典 Visual Basic 脚本通常遵循类似以下的模式:定义目标计算机(通常用“.”表示本地计算机),创建一个指向目标计算机的 WMI 对象。 root\cimv2 通过适当的模拟级别,执行查询“Select * from Win32_Product Where Name = 'Product Name'”,并对返回的每个对象调用以下代码: objSoftware.Uninstall()结果是,指定的应用程序无需任何手动操作即可卸载。
En PowerShell的逻辑非常相似,但语法更简洁。它被使用。 Get-WmiObject -Class Win32_Product 要检索所有 MSI 产品,请使用以下筛选条件 位置对象 按所需名称,并在循环中 的foreach该方法名为 卸载() 对每个匹配对象进行操作。例如,这种方法非常适合批量删除不再需要保留在设备库中的企业软件包。
然而,重要的是要记住: Win32_Product 可能存在副作用当列出此类产品时,Windows Installer 可能会触发健康检查并修复损坏的软件包。在大型生产环境中,此行为会产生大量流量、CPU 使用率和延迟,因此许多管理员更倾向于使用其他方法来清点软件,并将 Win32_Product 仅用于非常特殊的受控卸载情况。

使用 PowerShell 列出已安装的软件
当需要获取已安装程序列表时, PowerShell 提供了多种替代方案。有些检测方法基于WMI,而另一些则直接依赖于Windows注册表。没有一个命令能够完美适用于所有情况,因此,根据要检测的软件类型,结合几种技术通常很有帮助。
最直接的命令,虽然未必总是最明智的,是 Get-WmiObject Win32_Product (或其别名“gwmi Win32_Product”)。此命令使用 WMI 列出系统上安装的所有 MSI 产品。它非常方便,因为它返回包含丰富属性的对象,但缺点是可能会导致系统需要修复,并且会排除任何非 MSI 程序。
为了涵盖更多软件,许多管理员会求助于注册表。 库存计划关键在于 HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall 及其对应物 HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall 它们分别存储已安装的 64 位和 32 位程序的信息。使用 PowerShell,您可以执行如下命令: 获取项目属性 通过这些路由检索诸如 DisplayName、DisplayVersion、Publisher 或 InstallDate 之类的值。
经典方法涉及使用 gp 对两个路径都执行 Get-ItemProperty 命令(别名),并筛选 DisplayName 不为空的项。然后,仅选择 DisplayName 属性,即可快速获取“程序和功能”中可见的应用程序列表。这样可以避免依赖 WMI,并捕获更多安装程序,包括那些非 MSI 安装程序。
如果需要更完整的信息,通常会构建更复杂的命令来调用…… 获取项目属性 然后他们使用 选择对象 显示各种属性,例如显示名称、版本、制造商和安装日期。最后,它被应用。 Format-Table -AutoSize 这样,输出就可以在控制台上读取。这可以通过标准的 64 位分支或 Wow6432Node 分支来实现,后者可以支持 32 位软件。
另一个可用的工具是 WMIC (Windows 管理规范命令行工具),虽然在最新版本的 Windows 中已被弃用,但在许多服务器和工作站上仍然可以看到。类似这样的命令 wmic product 获取名称、版本 它列出了 MSI 产品的名称和版本,当您需要快速获得结果而无需输入复杂的脚本时,它非常有用。

卸载程序的显示名称、卸载字符串和注册表项
除了WMI之外,还有一个非常重要的部分 Windows 中的软件清单基于注册表。每个已安装的应用程序通常在我们前面提到的卸载路径中都有一个键,该键中包含一些值,这些值对于在控制面板中显示应用程序以及自动删除应用程序都至关重要。
每个条目中通常包含的两个最有趣的数值是: 显示名称 y 卸载字符串第一个名称对应于控制面板“程序和功能”中“卸载或更改程序”下显示的名称。也就是说,是用户在图形界面中看到的应用程序名称。
价值 卸载字符串 对于管理员来说,它更有价值,因为它包含了在控制面板中单击卸载按钮时 Windows 执行的命令。通常,这是一个调用…… 微执行器 卸载程序可以通过 GUID 和多个参数,或者制造商提供的带有特定选项的专有可执行文件来执行。了解此字符串后,您可以通过 PowerShell 脚本、VBScript 或其他管理工具远程或自动启动卸载程序。
如果使用 PowerShell 检查这些键 获取项目属性DisplayName、DisplayVersion、Publisher 和 UninstallString 等值可以组合使用,构建包含所有必要信息的完整应用程序列表,用于清点、审核和卸载。这种方法非常灵活,因为它独立于安装程序类型(MSI、EXE 等),并且不会触发与 Win32_Product 相关的修复。
视觉上,这一切都反映在窗户上。 “卸载或更改程序” 我们在“程序和功能”中可以找到这些信息。列表中的每一行通常都对应于所提及路径中的一个注册表项,包含一个显示名称(DisplayName)和一个通常关联的卸载字符串(UninstallString)。了解这种关系有助于诊断为什么应用程序有时不会出现在控制面板中,或者为什么手动卸载无法按预期工作。
获取 GUID 并检测不含 MSI 的软件
在实际应用中,反复出现的挑战之一是 查找已安装产品的 GUID 以便能够使用 msiexec 或部署工具卸载它。处理 MSI 包时,Win32_Product 让这项工作变得更加轻松,因为 IdentifyingNumber 属性会以标准格式返回精确的 GUID。
例如,如果您使用如下命令: Get-WmiObject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize此输出会生成一个表格,其中包含产品名称、其 GUID 以及 MSI 文件在 Windows 安装缓存中的位置。这种类型的输出对于验证企业代理(例如欺诈检测解决方案或安全工具)是否已正确安装并可通过 MSI 进行管理非常有用。
当程序没有显示出来时,问题就出现了。 经典的MSI产品在某些情况下,以 EXE 格式分发的工具或使用不同提供程序的工具可能具有不同的提供程序名称 (ProviderName),例如“Programs”而不是“msi”。在这种情况下,仅使用 Win32_Product 获取 GUID 将不起作用,因为根本没有可以传递给 msiexec 的 MSI 标识符。
在企业环境中,一个典型的场景是:技术人员会收到几台预装了制造商软件的笔记本电脑(例如,一批惠普ProBook)。他们的部分工作包括: 删除所有预装软件对于许多预装程序,只需检查 Win32_Product 或 Uninstall 键即可获得 GUID 或卸载字符串。但是,总有一些应用程序不遵循这种标准模式。
当 ProviderName 为“Programs”或其他与 MSI 无关的值时,通常是必要的。 直接在注册表中查找卸载字符串。在 UninstallString 中,即使没有典型的 Windows Installer GUID,您也可以找到系统用于卸载应用程序的命令。根据该字符串,您可以创建脚本,使用适当的参数调用该可执行文件,从而静默卸载应用程序。
在更复杂的情况下,如果供应商没有提供清晰的 MSI 安装包或标准的卸载字符串,您可能需要使用其他工具或查阅供应商的特定文档。但是,在许多环境下,大多数此类问题无需安装额外软件即可解决,仅需依赖 PowerShell、WMI 和系统注册表即可。
使用 Win32_Product 验证特定代理和工具
除了常规库存使用外,在某些特定情况下,组织还需要在较低层级进行验证。 存在特定的软件代理。 并正确安装。一个典型的例子是负责监控、安全或欺诈分析的代理,这些代理必须统一部署在所有设备上。
在这些情况下,可以使用类似这样的命令 获取 wmiobject Win32_Product | 格式表识别编号、名称、LocalPackage -AutoSize 这非常实用。输出结果提供产品名称、产品 ID(GUID)以及存储在 Windows 安装缓存中的 MSI 文件位置。有了这些信息,您可以验证是否安装了正确的软件包,以及其 MSI 文件是否可用于修复或受控卸载。
某些商业解决方案,例如高级欺诈检测平台,会明确记录其使用情况。 Win32_产品 作为验证您的代理的受支持方法。这些手册强调, 返回的信息属于机密信息。 仅供授权客户使用,禁止在公开或可公开访问的渠道发布,这凸显了某些企业环境的敏感性。
Win32_Product 的另一个常见用途是 快速识别办公套件的版本 如 微软的Office通过传统的 MSI 安装。只需按产品名称筛选,然后检查版本属性,即可查看计算机上安装的具体版本,这在管理迁移或批量更新以及需要了解每台计算机的初始版本时非常有用。
这些类型的检查与以下方面结合得非常好: 集中式库存系统 y 远程管理工具虽然 Win32_Product 并不适合一次性对数百台计算机进行大规模扫描,但它非常方便,例如: 抽查 或者作为部署后验证脚本的一部分。
掌握 关于Windows上安装的软件的不同信息来源 (WMI、注册表、控制面板和命令行)使您能够更轻松地处理诸如库存、批量卸载、代理验证和版本控制等任务,减少即兴发挥,从而节省日常系统管理的时间和精力。
对字节世界和一般技术充满热情的作家。我喜欢通过写作分享我的知识,这就是我在这个博客中要做的,向您展示有关小工具、软件、硬件、技术趋势等的所有最有趣的事情。我的目标是帮助您以简单而有趣的方式畅游数字世界。