调用 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 存储库,但必须将 lFlags 参数设置为在相应的 IWbemServices 调用中WBEM_FLAG_OWNER_UPDATE

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

开发 WMI 提供程序

设置命名空间安全描述符

保护提供商