다음을 통해 공유


애플리케이션에 공급자 통합

계측할 애플리케이션을 만들 때 가장 좋은 방법은 공급자를 애플리케이션 자체 내에 구성 요소로 포함하는 것입니다. 이 방법을 사용하면 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 공급자 개발하기