ExecQueryWmi 函数

执行查询以检索对象。

注意

此 API 仅供内部使用。 不应从开发人员代码中使用。

语法

HRESULT ExecQueryWmi (
   [in] BSTR                    strQueryLanguage,
   [in] BSTR                    strQuery,
   [in] long                    lFlags,
   [in] IWbemContext*           pCtx,
   [out] IEnumWbemClassObject** ppEnum,
   [in] DWORD                   authLevel,
   [in] DWORD                   impLevel,
   [in] IWbemServices*          pCurrentNamespace,
   [in] BSTR                    strUser,
   [in] BSTR                    strPassword,
   [in] BSTR                    strAuthority
);

参数

strQueryLanguage
[in] Windows 管理支持的有效查询语言的字符串。 它必须是“WQL”(WMI 查询语言的首字母缩写)。

strQuery
[in] 查询的文本。 此参数不能为 null

lFlags
[in] 影响此函数的行为的标志组合。 以下值是在 WbemCli.h 头文件中定义,也可以将它们定义为代码中的常数:

常数 Value 说明
WBEM_FLAG_USE_AMENDED_QUALIFIERS 0x20000 如果设置为此值,则函数会检索修改后的限定符,这些限定符存储在当前连接区域设置的本地化命名空间中。
如果未设置为此值,则函数仅检索存储在直接命名空间中的限定符。
WBEM_FLAG_RETURN_IMMEDIATELY 0x10 此标志会导致半同步调用。
WBEM_FLAG_FORWARD_ONLY 0x20 函数返回只进枚举器。 通常,相较于传统枚举器,只进枚举器更快并且使用的内存更少,但它们不允许调用克隆
WBEM_FLAG_BIDIRECTIONAL 0 WMI 保留指向枚举中的对象的指针,直到它们被释放。
WBEM_FLAG_ENSURE_LOCATABLE 0x100 确保所有返回的对象中有足够的信息,从而使系统属性(例如 __PATH、__RELPATH 和 __SERVER)不为 null
WBEM_FLAG_PROTOTYPE 2 此标志用于获取原型。 它不会执行查询,而是会返回类似于典型结果对象的对象。
WBEM_FLAG_DIRECT_READ 0x200 导致直接访问指定的类的提供程序,而不考虑其父类或任何子类。

推荐的标志是 WBEM_FLAG_RETURN_IMMEDIATELYWBEM_FLAG_FORWARD_ONLY 以获得最佳性能。

pCtx
[in] 通常,此值为 null。 否则,它是一个指向 IWbemContext 实例的指针,提供请求的类的提供程序可使用该实例。

ppEnum
[out] 如果未发生错误,则接收指向枚举器的指针,该枚举器允许调用方检索查询结果集中的实例。 查询可以具有包含 0 个实例的结果集。 有关详细信息,请参阅备注部分。

authLevel
[in] 授权级别。

impLevel
[in] 模拟级别。

pCurrentNamespace
[in] 指向表示当前命名空间的 IWbemServices 对象的指针。

strUser
[in] 用户名。 有关详细信息,请参阅 ConnectServerWmi 函数。

strPassword
[in] 密码。 有关详细信息,请参阅 ConnectServerWmi 函数。

strAuthority
[in] 用户的域名。 有关详细信息,请参阅 ConnectServerWmi 函数。

返回值

此函数返回的以下值是在 WbemCli.h 头文件中定义的,你也可以在代码中将这些值定义为常数:

常数 Value 说明
WBEM_E_ACCESS_DENIED 0x80041003 用户无权查看函数可以返回的一个或多个类。
WBEM_E_FAILED 0x80041001 发生了未知错误。
WBEM_E_INVALID_PARAMETER 0x80041008 参数无效。
WBEM_E_INVALID_QUERY 0x80041017 查询具有语法错误。
WBEM_E_INVALID_QUERY_TYPE 0x80041018 不支持所请求的查询语言。
WBEM_E_QUOTA_VIOLATION 0x8004106c 查询太过复杂。
WBEM_E_OUT_OF_MEMORY 0x80041006 没有足够的可用内存来完成该操作。
WBEM_E_SHUTTING_DOWN 0x80041033 WMI 可能已停止并重启。 再次调用 ConnectServerWmi
WBEM_E_TRANSPORT_FAILURE 0x80041015 当前进程和 WMI 之间的远程过程调用 (RPC) 链接已失败。
WBEM_E_NOT_FOUND 0x80041002 查询指定了不存在的类。
WBEM_S_NO_ERROR 0 函数调用成功。

注解

此函数包装对 IWbemServices::ExecQuery 方法的调用。

此函数处理 strQuery 参数中指定的查询,并创建一个枚举器,调用方可通过该枚举器访问查询结果。 此枚举器是指向 IEnumWbemClassObject 接口的一个指针;查询结果是通过 IWbemClassObject 接口提供的类对象的实例。

可以在 WQL 查询中使用的 ANDOR 关键字的数量存在限制。 复杂查询中使用大量的 WQL 关键字可能导致 WMI 返回 WBEM_E_QUOTA_VIOLATION(或 0x8004106c)错误代码作为 HRESULT 值。 WQL 关键字的限制取决于查询的复杂程度。

如果该函数调用失败,你可以通过调用 GetErrorInfo 函数获取额外的错误信息。

要求

平台:请参阅系统要求

标头:WMINet_Utils.idl

.NET Framework 版本:自 4.7.2 起可用

另请参阅