응용 프로그램에 공급자 통합

계측할 응용 프로그램을 만들 때 가장 좋은 방법은 공급자를 응용 프로그램 자체 내에 구성 요소로 포함하는 것입니다. 이 방법을 사용하면 WMI(Windows Management Instrumentation)가 프로그램 API를 통해 서비스 공급자와 직접 상호 작용할 수 있습니다. 또한 WMI에서 공급자를 분리하면 응용 프로그램이 WMI 대신 공급자 수명을 제어할 수 있습니다. WMI 프로세스에서 실행되는 공급자를 작성하는 방법에 대한 자세한 내용은 공급자를 작성하여 WMI에 데이터 제공을 참조하세요. 공급자의 호스팅 모델 및 보안 설정에 대한 자세한 내용은 공급자 호스팅 및 보안을 참조하세요.

다음 다이어그램에서는 분리된 공급자인 WMI와 응용 프로그램 간의 관계를 보여 줍니다.

wmi, 분리된 공급자 및 응용 프로그램 간의 관계

분리된 공급자 메서드에 대한 자세한 내용은 IWbemDecoupledRegistrarIWbemDecoupledBasicEventProvider를 참조하세요.

참고

분리된 공급자는 인스턴스, 메서드, 이벤트 공급자 및 이벤트 소비자를 지원합니다. 클래스 및 속성 공급자를 지원하지 않습니다. 자세한 내용은 클래스 공급자 작성메서드 공급자 작성을 참조하세요.

 

이 항목의 코드 예제를 올바르게 컴파일하려면 다음 참조 및 #include 문이 필요합니다.

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

다음 절차에서는 C++ 코드 예제를 사용하여 분리된 공급자를 응용 프로그램에 통합하는 방법을 설명합니다. 응용 프로그램의 초기화 메서드는 WMI가 등록된 분리된 공급자와만 상호 작용할 수 있도록 다음 단계를 수행합니다.

C++ 응용 프로그램에서 분리된 공급자 구현

  1. 호출 스레드에서 사용할 COM 라이브러리를 초기화합니다.

    다음 코드 예제에서는 COM 라이브러리를 초기화하는 방법을 보여줍니다.

    HRESULT hr = S_OK ;
    hr = CoInitializeEx (0, COINIT_MULTITHREADED );
    
  2. 기본 프로세스 보안 수준을 설정합니다.

    이 수준은 클라이언트 프로세스의 정보에 액세스하기 위해 다른 프로세스에 필요한 보안 수준을 설정합니다. 인증 수준은 RPC_C_AUTHN_LEVEL_DEFAULT여야 합니다. 자세한 내용은 WMI 보안 유지 관리를 참조하세요.

    다음 코드 예제에서는 기본 보안 수준을 설정하는 방법을 보여줍니다.

    hr = CoInitializeSecurity (NULL, 
        -1, 
        NULL, 
        NULL,
        RPC_C_AUTHN_LEVEL_DEFAULT,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL, 
        EOAC_DYNAMIC_CLOAKING, 
        NULL);
    
    if (FAILED(hr))
    {
      CoUninitialize();
      cout << "Failed to initialize security. Error code = 0x"
           << hex << hr << endl;
      return;
    }
    
  3. 분리된 공급자 등록자를 등록합니다.

    다음 코드 예제에서는 분리된 공급자 등록자를 등록하는 방법을 보여줍니다.

    CLSID CLSID_WbemDecoupledRegistrar;
    IID IID_IWbemDecoupledRegistrar;
    IWbemDecoupledRegistrar *myRegistrar = NULL;
    
    hr = CoCreateInstance(CLSID_WbemDecoupledRegistrar,
                          NULL,
                          CLSCTX_INPROC_SERVER,
                          IID_IWbemDecoupledRegistrar,
                          (void**)&myRegistrar);
    if (SUCCEEDED(hr))
    {
        IUnknown *pIUnknown = NULL;
        // CMyProv is the class added for WMI instance / event provider
        HRESULT hr = CMyProv::CreateInstance(NULL,&pIUnknown);
        if ( SUCCEEDED(hr))
        {
            hr = myRegistrar->Register(0,
                NULL,
                NULL,
                NULL,
                L"root\\cimv2",
                L"DecoupledInstanceProvider",
                pIUnknown);
    
                pIUnknown->Release();
        }
    }
    
    if (FAILED (hr))
    {
        if ( myRegistrar )
        {
            myRegistrar->Release () ;
        }
    }
    
  4. 분리된 이벤트 공급자를 등록합니다.

    다음 코드 예제에서는 분리된 이벤트 공급자를 등록하는 방법을 보여줍니다.

    IWbemDecoupledBasicEventProvider *myEvtRegistrar;
    
    // -- Create an instance of IWbemDecoupledEventProvider
    hr = CoCreateInstance(CLSID_WbemDecoupledBasicEventProvider,
                          NULL,
                          CLSCTX_INPROC_SERVER,
                          IID_IWbemDecoupledBasicEventProvider,
                          (void**)&myEvtRegistrar);
    
    if (SUCCEEDED(hr))
    {
       // -- Register the DecoupledEventProvider
       hr = myEvtRegistrar->Register(0,
                                     NULL,
                                     NULL,
                                     L"root\\cimv2",
                                     L"DecoupledEventProvider",
                                     NULL, NULL);
       if (SUCCEEDED(hr))
       {
          IWbemServices *pService = NULL;
          hr = myEvtRegistrar->GetService (0, NULL, &pService);
          if (SUCCEEDED(hr))
          {
             IWbemObjectSink *pSink = NULL;
             hr = myEvtRegistrar->GetSink ( 0, NULL, &pSink );
             if (SUCCEEDED(hr))
             {
                // Provide events
             }
          }
       } 
    }
    
  5. 공급자의 기능에 필요한 WMI를 호출합니다. 자세한 내용은 클래스 및 인스턴스 정보 조작을 참조하세요. 공급자가 스크립트 또는 응용 프로그램의 데이터 요청을 서비스하는 경우 자세한 내용은 클라이언트 가장을 참조하세요.

종료하기 직전에 응용 프로그램을 정리해야 합니다. 다음 절차에서는 WMI가 정보를 쿼리하지 않도록 분리된 공급자의 등록을 취소하는 방법을 설명합니다.

다음 절차에서는 분리된 공급자의 등록을 취소하는 방법을 설명합니다.

분리된 공급자 등록자 등록

  1. 등록을 취소하고 등록을 해제합니다.

    다음 코드 예제에서는 등록을 취소하고 등록을 해제하는 방법을 보여줍니다.

    myRegistrar->UnRegister();
    myRegistrar->Release();
    
  2. 등록을 취소하고 이벤트 공급자를 해제합니다.

    다음 코드 예제에서는 등록을 취소하고 이벤트 공급자를 해제하는 방법을 보여줍니다.

    myEvtRegistrar->UnRegister();
    myEvtRegistrar->Release();
    
  3. COM 서버를 정리합니다.

    다음 코드 예제에서는 COM 라이브러리를 초기화 취소하는 방법을 보여줍니다.

    CoUninitialize();
    

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

공급자 보안

WMI 공급자 개발