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 方法包括 AssociatorsOfReferencesToSubclassesOf

查询返回空结果集的情况并不是错误。 无论 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