WMI 查询语言示例






4.98/5 (37投票s)
本文通过一系列 WQL 查询示例,简要介绍了 WQL 教程。
引言
Windows Management Instrumentation (WMI) 是 Microsoft 对 WBEM 的实现,WBEM 是一项旨在简化系统和网络管理的行业倡议。WMI 随 Windows 2000 一起引入,此后不断发展,包含了关于大多数 Windows 硬件和软件资源的数据。
有几种方法可以访问 WMI 数据,其中大多数都使用 WQL 查询。您可以使用多种工具来执行 WQL 查询,其中最容易访问的是一个名为 WMI Tester (wbemtest.exe) 的工具,它随 Windows 一起安装。
本文是一篇简短的教程,通过一系列 WQL 查询示例,旨在阐明 WQL 的几个方面。我按类型对查询进行了分组。如果您有任何疑问,或者想分享一个查询,请在页面底部留言。
此处提供的大部分查询都将获取所有 WMI 对象属性(例如,Select * …),以使查询更易于阅读。如果您熟悉 SQL,您可能知道建议您永远不要使用 Select *
(除非您真的需要所有列),以提高查询效率。我尚未确认仅选择特定属性对 WQL 中的查询效率有任何影响,但您可以轻松地将 * 替换为属性名称。
WMI Tester (Wbemtest.exe) 是一个提供执行 WQL 查询基本功能的工具。您可以通过在“运行”框中键入 'wbemtest.exe' 来运行它。
这将打开 WMI Tester。
您首先需要连接到包含您要查询的类的 WMI 命名空间(大多数情况下是 Root\Cimv2
)。
单击“Query”或“Notification Query”按钮运行查询。
输入查询文本。
单击“Apply”按钮。这将打开一个显示查询结果的窗口。
如果查询无效,您将收到错误消息。
对象查询
对象查询用于获取系统资源信息。
查询文本
Select * From Win32_Process
WMI 命名空间:Root\Cimv2
。
注释
这可能是各种 WMI 文章和教科书中找到的最常见的 WQL 查询。它仅获取名为 Win32_Process
的 WMI 类的所有实例,该类代表 Windows 进程。如果您对 Win32_Process
的属性感兴趣,请 在此处查看。
查询文本
Select * From Win32_Process
Where ProcessId = 608
WMI 命名空间:Root\Cimv2
。
注释
如果您不想获取所有 Windows 进程,可以使用 WHERE
子句限定您的查询。该子句的写法如下:
Where PropertyName Operator PropertyValue
其中 Operator
是 WQL 关系运算符之一。上面的查询将返回进程 ID 等于 608 的 Win32_Process
实例。
查询文本
Select * From Win32_Process
Where Priority > 8
WMI 命名空间:Root\Cimv2
。
注释
WQL 关系运算符之一是“>”(大于)。上面的查询返回 Priority
大于 8 的所有 Win32_Process
实例。
查询文本
Select * From Win32_Process
Where WriteOperationCount < 1000
WMI 命名空间:Root\Cimv2
。
注释
此查询返回 WriteOperationCount
小于 1000 的所有 Win32_Process
实例。
查询文本
Select * From Win32_Process Where ParentProcessId <> 884
Select * From Win32_Process Where ParentProcessId != 884
Select * From Win32_Process Where Not ParentProcessId = 884
WMI 命名空间:Root\Cimv2
。
注释
这三个查询都返回 ParentProcessId
**不等于** 884 的 Win32_Process
实例。
查询文本
Select * From Win32_Service
WMI 命名空间:Root\Cimv2
。
注释
另一个常见的查询是检索有关 Windows 服务的所有信息。有关 Win32_Service
类的详细信息,请 在此处查看。请注意,此查询返回所有类实例。有时这正是您想要的,有时则不是,还有时,这是您绝对应该避免的。
查询文本
Select * From Win32_Service
Where Name = "MSSQL$SQLEXPRESS"
WMI 命名空间:Root\Cimv2
。
注释
这是一个改进的查询——它只返回 Name
属性等于“MSSQL$SQLEXPRESS
”的 Win32_Service
实例。碰巧 Name
是 Win32_Service
类的键属性,因此返回的 WMI 对象集合将包含 0 或 1 个项,但总的来说,如果您使用 WMI 类属性值限定查询,您将获得所有属性值与输入值匹配的类实例。
查询文本
Select * From Win32_Service
Where DisplayName = "Plug and Play"
WMI 命名空间:Root\Cimv2
。
注释
这是一个注意事项。如果您熟悉 Windows 服务,您就知道您可以使用 Services.msc (Start->Run-> Services.msc) 访问服务信息。当您打开该小程序时,“Name”列中的文本**不**等于 Win32_Service.Name
值。它等于 Win32_Service.DisplayName
属性值,因此如果您想按其服务控制面板小程序名称获取服务,请使用上面的查询。
查询文本
Select * From Win32_Service
Where PathName = "C:\\WINDOWS\\system32\\inetsrv\\inetinfo.exe"
WMI 命名空间:Root\Cimv2
。
注释
这是另一个注意事项。如果属性值包含反斜杠,您需要通过在每个反斜杠之前(或之后)添加另一个反斜杠来对其进行转义——否则,您将收到“Invalid query”(无效查询)错误。
查询文本
Select * From Win32_Service
Where Name Like "%SQL%"
WMI 命名空间:Root\Cimv2
。
注释
如果您不知道确切的服务名称(或显示名称),该怎么办?这时 LIKE
WQL 运算符就很有用了。就像在 SQL 中一样,“%”元字符可以替换任何零个或多个字符的字符串,因此此查询返回 Name
属性包含字符串“SQL”的所有 Win32_Service
实例。
查询文本
Select * From Win32_Service
Where Name > "M" And Name < "O"
WMI 命名空间:Root\Cimv2
。
注释
您可以使用所有 WQL 运算符处理字符串属性。此查询返回 Name
大于“M”或小于“O”的所有 Win32_Service
实例。通常的字符串比较规则适用。
查询文本
Select * From Win32_Service
Where ExitCode = "1077"
WMI 命名空间:Root\Cimv2
。
注释
Win32_Process.ExitCode
属性类型为 UInt32
,但它被包含在引号中。WMI 将尽最大努力解释字符串值并将其转换为适当的类型。反之则不然——对于字符串属性,您必须使用引号。
查询文本
Select * From Cim_DataFile
Where Drive = "C:"
And Path = "\\Scripts\\"
WMI 命名空间:Root\Cimv2
。
注释
Cim_DataFile
是一个 WMI 类,您绝对应该始终在其中使用 WHERE
子句。单独运行 ‘Select * From Cim_DataFile
’ 可能需要数小时才能完成,因为它会返回您计算机上的所有文件。请注意,Path
属性不包含文件名或存储在 Drive
属性中的驱动器号。
查询文本
Associators Of {Win32_NetworkAdapter.DeviceId=1}
WMI 命名空间:Root\Cimv2
。
注释
如您所见,Select
查询不是 WQL 中唯一的查询类型。与 Select
查询一样,Associators Of
查询也可以返回 WMI 对象或类定义。但有一个区别:Select
查询始终返回一个 WMI 类的实例集合,或者至少是具有相同父类的类的实例。另一方面,Associators Of
查询通常返回属于不同 WMI 类的 WMI 对象集合。返回对象的一个共同点是,它们都与 Associators Of
查询(在花括号之间)中指定的 WMI 对象相关联。请注意,您必须使用对象的键属性来指定其路径,并且属性名、等号和属性值之间不能有空格。在我的计算机上,上面的查询会返回以下类的实例:
Win32_ComputerSystem
Win32_DeviceMemoryAddress
Win32_IRQResource
Win32_NetworkAdapterConfiguration
Win32_NetworkProtocol
Win32_PnPEntity
Win32_PortResource
Win32_SystemDriver
查询文本
Associators Of {Win32_NetworkAdapter.DeviceId=1}
Where ResultClass = Win32_NetworkAdapterConfiguration
WMI 命名空间:Root\Cimv2
。
注释
大多数情况下,您不需要与 WMI 对象关联的所有 WMI 对象。您可以通过在 Associators Of
查询的 Where
子句中指定返回对象的类来缩小返回集合的范围。上面的查询返回与源对象关联的 Win32_NetworkAdapterConfiguration
实例。
查询文本
Associators Of {Win32_NetworkAdapter.DeviceId=1}
Where AssocClass = Win32_NetworkAdapterSetting
WMI 命名空间:Root\Cimv2
。
注释
WMI 类通过一种特殊的 WMI 类(称为关联类)进行关联。Win32_NetworkAdapter
和 Win32_NetworkAdapterConfiguration
对象通过名为 Win32_NetworkAdapterSetting
的关联类的实例进行关联。如您所见,您也可以使用关联类名称来限制返回的对象集合。
查询文本
References Of {Win32_NetworkAdapter.DeviceId=1}
WMI 命名空间:Root\Cimv2
。
注释
您可以使用 References Of
查询来检查 WMI 对象关联。与 Associators Of
查询不同,References Of
查询仅返回 WMI 关联类。此查询返回以下 WMI 关联类的实例:
Win32_AllocatedResource
Win32_NetworkAdapterSetting
Win32_PnPDevice
Win32_ProtocolBinding
Win32_SystemDevices
事件查询
事件查询用于 WMI 事件订阅。
查询文本
Select * From __InstanceCreationEvent
Within 5
Where TargetInstance Isa "Win32_Process"
WMI 命名空间:Root\Cimv2
。
注释
此查询在 WMI 示例中也经常出现。WMI 事件查询与其他查询类型不同,它们不会立即返回 WMI 对象。相反,它们用于订阅 WMI 事件,并在事件到来时返回对象。请注意事件查询中不存在于其他查询类型中的两个显著特征:Within
子句和 __InstanceCreationEvent
类。Within
子句告诉 WMI 每隔多少秒轮询一次事件。在上面的查询中,轮询间隔为 5 秒。WQL 事件监视会消耗系统资源,因此在及时获取事件的需求和不给系统增加负担的需求之间取得平衡非常重要。__InstanceCreationEvent
类是仅在事件查询中使用的类之一(其他两个常用的类是 __InstanceModificationEvent
和 __InstanceDeletionEvent
)。当请求的事件到来时,会创建一个此类的实例。__InstanceCreationEvent.TargetInstance
属性保存了实际触发事件的 WMI 类的引用。在上面的查询中,它是 Win32_Process
类,我们可以使用 TargetInstance
属性来访问其属性。
查询文本
Select * From __InstanceCreationEvent
Within 5
Where TargetInstance Isa "Win32_Process"
And TargetInstance.Name = "Notepad.exe"
WMI 命名空间:Root\Cimv2
。
注释
此查询监视进程创建事件,但仅限于名为 ‘Notepad.exe’ 的进程。
查询文本
Select * From __InstanceDeletionEvent
Within 5
Where TargetInstance Isa "Win32_Process"
And TargetInstance.Name = "Notepad.exe"
WMI 命名空间:Root\Cimv2
。
注释
使用此查询监视进程名为 ‘Notepad.exe’ 的进程删除事件。进程删除事件发生在进程退出时。有一点您应该注意,对于像这样的查询:如果您打开记事本然后快速关闭它(在 5 秒内),WMI 可能会错过并不会报告为事件。
查询文本
Select * From __InstanceModificationEvent
Within 5
Where TargetInstance Isa "Win32_Process"
And TargetInstance.Name = "Notepad.exe"
WMI 命名空间:Root\Cimv2
。
注释
此查询监视 Win32_Process
修改事件,而不是进程修改事件。这是一个重要的区别——如果 Windows 进程实体有一个属性未由 Win32_Process
WMI 类表示,并且该属性发生更改,WMI 将不会报告更改。只有 Win32_Process
属性的更改会作为 WMI 事件返回。
查询文本
Select * From __InstanceOperationEvent
Within 5
Where TargetInstance Isa "Win32_Process"
And TargetInstance.Name = "Notepad.exe"
WMI 命名空间:Root\Cimv2
。
注释
此查询监视所有三种类型的事件:创建、删除和修改事件。__InstanceOperationEvent
类是 __InstanceCreation
、__InstanceDeletion
和 __InstanceModification
类的父类,您可以利用这一事实同时订阅这三种事件类型。__InstanceOperationEvent
类是 abstract
(这意味着它没有实例),因此事件返回的实际事件类是三个实例类之一,您可以通过检查其 __Class
系统属性来找出是哪个。这样,您就可以确定事件类型。
架构查询
架构查询用于获取关于 WMI 本身及其结构的信息。
查询文本
Select * From Meta_Class
WMI 命名空间:任意。
注释
这是最基本的架构查询。您可以连接到任何 WMI 命名空间并使用此查询来获取其中存在的所有类。Meta_Class
是仅在架构查询中使用的元类。
查询文本
Select * From Meta_Class
Where __Class = "Win32_LogicalDisk"
WMI 命名空间:Root\Cimv2
。
注释
此查询使用 __Class
系统属性来获取 Win32_LogicalDisk
类。架构查询不返回类实例,而是返回类定义,并且像这样的查询将返回一个类定义,而不管是否存在任何实例。您为什么要获取类定义?每个新的 Windows 版本都会添加新的 WMI 类,而像这样的查询可以检查某个系统上是否存在一个类。
查询文本
Select * From Meta_Class
Where __Superclass Is Null
WMI 命名空间:任意。
注释
WMI 是分层组织的——有命名空间层次结构作为类容器,每个命名空间内有类层次结构。只有一个名为“Root”的顶级命名空间,但一个命名空间中总有多个顶级类(即使您创建一个新的空命名空间,也会自动创建一些系统 WMI 类)。您可以使用此查询来获取命名空间的所有顶级类。(如果使用 '=
' 而不是 'Is
',此查询也有效。)
查询文本
Select * From Meta_Class
Where __Superclass = "Win32_CurrentTime"
WMI 命名空间:Root\Cimv2
。
注释
对于每个 WMI 类,__Superclass
属性保存其直接父类的名称。您可以使用此查询返回一个类的所有直接子类。请注意类名周围的引号。__Superclass
是七个 WMI 系统属性之一(此处查看详细信息),您可以在架构查询中使用它们。其中只有一个例外——__Dynasty
属性是字符串数组,您不能在 WQL 查询中使用数组属性。上面的查询返回两个类:Win32_LocalTime
和 Win32_UTCTime
,它们是 Win32_CurrentTime
的直接子类。
查询文本
Select * From Meta_Class
Where __Dynasty = "Cim_Setting"
WMI 命名空间:Root\Cimv2
。
注释
__Dynasty
是另一个 WMI 系统属性——对于每个类,它保存该类派生自的顶级类的名称。此查询将返回 Cim_Setting
的所有子级,Cim_Setting
是位于 Root\Cimv2
命名空间中的一个顶级类。
查询文本
Select * From Meta_Class
Where __Class Like "Win32%"
WMI 命名空间:Root\Cimv2
。
注释
所有 WMI 类都属于一个架构(或者至少应该如此)。例如,名称以“Cim”开头的类属于 Cim
架构,这是一组由 DMTF 定义的“核心和通用”WMI 类。名称以“Win32”开头的类属于“Win32
”架构——这些类是从 Cim
类派生并扩展它们的。您可以使用此查询列出属于“Win32
”架构的所有类。该查询使用 Like
运算符——这意味着,它不能用于 Windows XP 之前的 Windows 版本,因为 Like
运算符已添加到 WQL 中,用于 XP。
查询文本
Select * From Meta_Class
Where __This Isa "__Event"
WMI 命名空间:任意。
注释
尽管它使用了 __Event
类,但这不是一个事件查询。它是一个架构查询,列出了 __Event
的所有子类(直接和间接)。请注意 ‘__This
’ 的使用,这是一个用于架构查询的特殊 WMI 属性,以及 ‘Isa
’ 运算符。