SWbemServices.ExecQuery 方法
SWbemServices 对象的 ExecQuery 方法会执行查询来检索对象。 这些对象可通过返回的 SWbemObjectSet 集合获得。
此方法是以半同步模式调用的。 有关详细信息,请参阅调用方法。
有关此语法的说明,请参阅脚本 API 的文档约定。
语法
objWbemObjectSet = .ExecQuery( _
ByVal strQuery, _
[ ByVal strQueryLanguage ], _
[ ByVal iFlags ], _
[ ByVal objWbemNamedValueSet ] _
)
parameters
-
strQuery
-
必需。 包含查询文本的字符串。 此参数不能为空。 若要详细了解如何生成 WMI 查询字符串,请查看使用 WQL 进行查询和 WQL 参考。
-
strQueryLanguage [可选]
-
包含要使用的查询语言的字符串。 如果已制定,此值必须为“WQL”。
-
iFlags [可选]
-
整数,用于确定查询行为并确定此调用是否立即返回。 此参数的默认值为 wbemFlagReturnImmediately。 此参数可以接受以下值。
-
wbemFlagForwardOnly (32 (0x20))
-
导致返回只进枚举器。 通常,相较于传统枚举器,只进枚举器快得多并且使用的内存更少,但它们不允许调用 SWbemObject.Clone_。
-
wbemFlagBidirectional (0 (0x0))
-
使 WMI 保留指向枚举对象的指针,直到客户端释放枚举器。
-
wbemFlagReturnImmediately (16 (0x10))
-
使调用立即返回。
-
wbemFlagReturnWhenComplete (0 (0x0))
-
使此调用被阻止,直到查询完成为止。 此标志在同步模式下调用方法。
-
wbemQueryFlagPrototype (2 (0x2))
-
用于原型设计。 此标志阻止查询发生,并返回类似于典型结果对象的对象。
-
wbemFlagUseAmendedQualifiers (131072 (0x20000))
-
使 WMI 返回具有基类定义的类修改数据。 有关详细信息,请参阅本地化 WMI 类信息。
objWbemNamedValueSet [optional]
通常,此参数未定义。 如果已定义,此参数是一个 SWbemNamedValueSet 对象,其元素表示可供提供请求服务的提供程序使用的上下文信息。 支持或需要此类信息的提供程序必须记录已识别的值名称、值数据类型、允许的值和语义。
返回值
如果未发生错误,此方法将返回 SWbemObjectSet 对象。 这是一个包含查询结果集的对象集合。 调用方可以使用你所使用的编程语言的集合的实现来检查集合。 有关详细信息,请参阅访问集合。
错误代码
ExecQuery 方法完成后,Err 对象可能会包含以下列表中的错误代码之一。
-
wbemErrAccessDenied - 2147749891 (0x80041003)
-
当前用户没有查看结果集的权限。
-
wbemErrFailed - 2147749889 (0x80041001)
-
错误。
-
wbemErrInvalidParameter - 2147749896 (0x80041008)
-
指定的参数无效。
-
wbemErrInvalidQuery - 2147749911 (0x80041017)
-
查询语法无效。
-
wbemErrInvalidQueryType - 2147749912 (0x80041018)
-
不支持请求的查询语言。
-
wbemErrOutOfMemory - 2147749894 (0x80041006)
-
内存不足,无法完成此操作。
备注
ExecQuery 是检索 WMI 信息的最常用的调用之一。 对 ExecQuery 的标准调用如下所示:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service where Name='Alerter'")
For Each objService in colServices
Return = objService.StopService()
If Return <> 0 Then
Wscript.Echo "Failed " &VBNewLine & "Error code = " & Return
Else
WScript.Echo "Succeeded"
End If
Next
请注意,使用表示相应命名空间和安全性的名字对象创建 SWbemServices 对象,然后通过服务进行 ExecQuery 调用。 有关更完整的讨论,请参阅创建 WMI 脚本和枚举 WMI。
与 InstancesOf 方法一样,ExecQuery 方法始终返回 SWbemObjectSet 集合。 因此,WMI 脚本必须枚举 ExecQuery 返回的集合才能访问集合中的每个托管资源实例,如下所示:
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colSWbemObjectSet = objSWbemServices.ExecQuery _
("SELECT * FROM Win32_Service")
For Each objSWbemObject In colSWbemObjectSet
Wscript.Echo "Name: " & objSWbemObject.Name
Next
返回 SWbemObjectSet 的其他 SWbemServices 方法包括 AssociatorsOf、ReferencesTo 和 SubclassesOf。
查询返回空结果集的情况并不是错误。 无论 strQuery 参数中是否请求键属性,ExecQuery 方法都会返回键属性。 如果在执行此方法时发生错误,并且你没有使用 wbemFlagReturnImmediately 标志,则在尝试访问返回的对象集之前,不会设置 Err 对象。 但如果使用 wbemFlagReturnWhenComplete 标志,则会在调用 ExecQuery 方法时设置 Err 对象。
可在 WQL 查询中使用的 AND 和 OR 关键字存在数量限制。 复杂查询中使用大量的 WQL 关键字可能导致 WMI 返回 WBEM_E_QUOTA_VIOLATION 错误代码作为 HRESULT 值。 WQL 关键字的限制取决于查询的复杂程度。
示例
以下 VBScript 代码示例将查找本地计算机上的所有磁盘驱动器,并显示磁盘驱动器的设备 ID 和类型。
Set colDisks = GetObject( _
"Winmgmts:").ExecQuery("Select * from Win32_LogicalDisk")
For Each objDisk in colDisks
Select Case objDisk.DriveType
Case 1
Wscript.Echo "No root directory. Drive type could not be determined."
Case 2
Wscript.Echo "DeviceID= "& objDisk.DeviceID & " DriveType = Removable drive"
Case 3
Wscript.Echo "DeviceID= "& objDisk.DeviceID & " DriveType = Local hard disk"
Case 4
Wscript.Echo "DeviceID= "& objDisk.DeviceID & " DriveType = Network disk"
Case 5
Wscript.Echo "DeviceID= "& objDisk.DeviceID & " DriveType = Compact disk"
Case 6
Wscript.Echo "DeviceID= "& objDisk.DeviceID & " DriveType = RAM disk"
Case Else
Wscript.Echo "Drive type could not be determined."
End Select
Next
要求
要求 | 值 |
---|---|
最低受支持的客户端 |
Windows Vista |
最低受支持的服务器 |
Windows Server 2008 |
标头 |
|
类型库 |
|
DLL |
|
CLSID |
CLSID_SWbemServices |
IID |
IID_ISWbemServices |