Поделиться через


Выполнение вызовов WMI

Поставщики могут вызывать методы, реализованные WMI, в рамках реализации своих методов. Однако существуют особые соображения в случае, если поставщик вызывает метод IWbemServices в реализации WMI из собственной реализации того же самого метода. Эти рекомендации важны независимо от того, вызывает ли поставщик синхронную или асинхронную версию метода.

Каждый метод IWbemServices, который поставщик может реализовать, имеет параметр pCtx, указатель на реализацию интерфейса IWbemContext. При вызове WMI поставщика WMI передает допустимый указатель для этого параметра. Поставщик должен всегда передавать этот же указатель во всех вызовах WMI, которые они выполняют во время обслуживания запросов. Неправильная установка pCtx может привести к началу бесконечного цикла в WMI.

В следующем примере кода показан правильный способ вызова реализации WMI GetObject из реализации GetObjectAsync.

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, запрашивающие изменение данных при обслуживании запроса на чтение. Единственными поставщиками, которые являются исключениями из этого правила, являются поставщики push-уведомлений. Поставщик push-уведомлений — это поставщик классов, который хранит данные в репозитории WMI и использует WMI для обработки запросов от клиентов. При обслуживании запроса на чтение поставщик push-уведомлений может обновить репозиторий WMI, но должен задать для параметра lFlags значение WBEM_FLAG_OWNER_UPDATE в соответствующем вызове IWbemServices.

Поставщики событий не должны вносить изменения в класс во время обработки вызова. Они также не могут выдавать вызовы, связанные с событиями, например изменение фильтра событий.

Разработка поставщика WMI

Установка дескрипторов безопасности пространства имен

защита вашего поставщика