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
标头
Wbemdisp.h
类型库
Wbemdisp.tlb
DLL
Wbemdisp.dll
CLSID
CLSID_SWbemServices
IID
IID_ISWbemServices

另请参阅

SWbemServices

SWbemServices.Get

使用 WQL 进行查询

创建 WMI 脚本

枚举 WMI