WMI 호출

공급자는 메서드 구현 내에서 WMI에 의해 구현된 메서드를 호출할 수 있습니다. 그러나 공급자가 동일한 메서드의 자체 구현 내에서 IWbemServices 메서드의 WMI 구현을 호출하는 경우 특별한 고려 사항이 있습니다. 이러한 고려 사항은 공급자가 메서드의 동기 또는 비동기 버전을 호출하는지 여부에 관계없이 중요합니다.

공급자가 구현할 수 있는 각 IWbemServices 메서드에는 IWbemContext 인터페이스 구현에 대한 포인터인 pCtx 매개 변수가 있습니다. 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 공급자 개발

네임스페이스 보안 설명자 설정

공급자 보안