调用 WMI

提供程序可以从其方法实现中调用 WMI 实现的方法。 但是,当提供程序从其自己的同一方法实现中调用 IWbemServices 方法的 WMI 实现时,有一些特殊注意事项。 无论提供程序是调用方法的同步版本还是异步版本,这些注意事项都很重要。

提供程序可以实现的每个 IWbemServices 方法都有一个 pCtx 参数,一个指向 IWbemContext 接口实现的指针。 当 WMI 调用提供程序时,WMI 在此参数中传递有效的指针。 提供程序必须始终在为请求提供服务时对 WMI 的任何调用中传递此指针。 忽略适当地设置 pCtx 可能会导致 WMI 启动无限循环。

下面的代码示例演示从 GetObjectAsync 的实现中调用 GetObject 的 WMI 实现的正确方法。

STDMETHODIMP CClassProv::GetObjectAsync (BSTR ObjectPath,
    long lFlags, IWbemContext *pCtx,
    IWbemObjectSink *pHandler)
{
  IWbemClassObject *pclObj = NULL;
  IWbemServices* m_pNamespace;
  HRESULT hr = m_pNamespace->GetObject(
      _bstr_t(L"AClass"), 0, pCtx, &pclObj, 
      NULL );
  pclObj->Release();
  return pHandler->SetStatus(0, hr, NULL, NULL);
}

本主题中的 C++ 代码示例需要以下引用和#include 语句才能正确编译。

#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")

实例、类和属性提供程序不得向 WMI 发出任何调用,请求在为读取请求提供服务时修改数据。 此规则例外的唯一例外提供程序是推送提供程序。 推送提供程序是一种类提供程序,它将数据存储在 WMI 存储库中,并依赖于 WMI 来处理来自客户端的请求。 在为读取请求提供服务时,推送提供程序可以更新 WMI 存储库,但必须在相应的 IWbemServices 调用中将 lFlags 参数设置为 WBEM_FLAG_OWNER_UPDATE。

事件提供程序在为调用提供服务时不得进行任何类更改。 事件提供程序也不能发出任何与事件相关的调用,例如修改事件筛选器。

开发 WMI 提供程序

设置命名空间安全描述符

保护提供程序