공급자 등록

공급자를 구현하기 전에 먼저 공급자를 WMI에 등록해야 합니다. 공급자를 등록하면 공급자 형식과 공급자가 지원하는 클래스가 정의됩니다. WMI는 등록된 공급자에만 액세스할 수 있습니다.

참고

MI 공급자 등록에 대한 관세한 내용은 방법: MI 공급자 등록을 참조하세요.

 

공급자를 등록하기 전에 공급자 코드를 작성할 수 있습니다. 그러나 WMI에 등록되지 않은 공급자를 디버그하기가 매우 어렵습니다. 공급자에 대한 인터페이스를 결정하면 공급자의 목적과 구조를 간략하게 설명하는 데도 도움이 됩니다. 따라서 공급자를 등록하면 공급자를 디자인하는 데 도움이 됩니다.

관리자만 공급자를 등록하거나 삭제할 수 있습니다.

공급자가 수행하는 다양한 유형의 공급자 함수에 대해 공급자를 등록해야 합니다. 거의 모든 공급자는 정의하는 클래스의 인스턴스를 제공하지만 속성 데이터, 메서드, 이벤트 또는 클래스도 제공할 수 있습니다. 공급자는 이벤트 소비자 공급자 또는 성능 카운터 공급자로 등록될 수도 있습니다. 각 형식에 대해 별도의 공급자가 여러 개 있는 대신 하나의 공급자에서 모든 공급자 기능을 결합하는 것이 좋습니다. 예를 들어, 메서드와 인스턴스를 제공하는 시스템 레지스트리 공급자와 인스턴스, 메서드 및 이벤트를 제공하는 디스크 할당량 공급자가 있습니다.

공급자가 수행하는 다양한 유형의 공급자 함수에 대해 공급자를 등록해야 합니다. 거의 모든 공급자는 정의하는 클래스의 인스턴스를 제공하지만 속성 데이터, 메서드, 이벤트 또는 클래스도 제공할 수 있습니다. 공급자는 이벤트 소비자 공급자 또는 성능 카운터 공급자로 등록될 수도 있습니다.

각 등록 유형에 동일한 __Win32Provider 인스턴스가 사용됩니다.

예: 공급자 인스턴스 만들기 및 등록

다음 예제에서는 root\cimv2 네임스페이스에 시스템 레지스트리 공급자의 인스턴스를 만들어 등록하는 MOF 파일을 보여줍니다. 인스턴스 및 메서드 등록에 긴 경로 이름을 사용할 필요가 없도록 공급자에 별칭 $Reg를 할당합니다. 자세한 내용은 별칭 만들기를 참조하세요.

// Place the Registry provider in the root\cimv2 namespace
#pragma namespace("\\\\.\\ROOT\\cimv2")

// Create an instance of __Win32Provider
instance of __Win32Provider as $Reg
{
Name = "RegProv";        
CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
HostingModel = "NetworkServiceHost:LocalServiceHost";
};

// Register as an instance provider by
// creating an instance
// of __InstanceProviderRegistration
instance of __InstanceProviderRegistration
{
 provider = $Reg;
 SupportsDelete = FALSE;
 SupportsEnumeration = TRUE;
 SupportsGet = TRUE;
 SupportsPut = TRUE;
};

// Register as a method provider by
// creating an instance
// of __MethodProviderRegistration
instance of __MethodProviderRegistration
{
 provider = $Reg;
};

// Define the StdRegProv class
[dynamic: ToInstance, provider("RegProv")]
class StdRegProv
{
[implemented, static] uint32 CreateKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName);
[implemented, static] uint32 DeleteKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName);
[implemented, static] uint32 EnumKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [OUT] string sNames[]);
[implemented, static] uint32 EnumValues(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [OUT] string sNames[], 
 [OUT] sint32 Types[]);
[implemented, static] uint32 DeleteValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName);
 [implemented, static] uint32 SetDWORDValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] uint32 uValue = 3);
[implemented, static] uint32 GetDWORDValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] uint32 uValue);
[implemented, static] uint32 SetStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue = "hello");
[implemented, static] uint32 GetStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [in] string sValueName, 
 [OUT] string sValue);
[implemented, static] uint32 SetMultiStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue[] = {"hello", "there"});
[implemented, static] uint32 GetMultiStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] string sValue[]);
[implemented, static] uint32 SetExpandedStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue = "%path%");
[implemented, static] uint32 GetExpandedStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] string sValue);
[implemented, static] uint32 SetBinaryValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [in] string sValueName, 
 [in] uint8 uValue[] = {1, 2});
[implemented, static] uint32 GetBinaryValue(
 {IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] uint8 uValue[]);
[implemented, static] uint32 CheckAccess(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] uint32 uRequired = 3, 
 [OUT] boolean bGranted);
};

예: 공급자 등록

다음 절차에서는 공급자를 등록하는 방법을 설명합니다.

공급자를 등록하려면

  1. 공급자를 COM 서버로 등록합니다.

    필요한 경우 레지스트리 항목을 만들어야 할 수 있습니다. 이 프로세스는 모든 COM 서버에 적용되며 WMI와 관련이 없습니다. 자세한 내용은 Microsoft Windows SDK(소프트웨어 개발 키트) 설명서의 COM 부분을 참조하세요.

  2. __Win32Provider 인스턴스와 __InstanceProviderRegistration 같은 __ProviderRegistration서 직접 또는 간접적으로 파생된 클래스의 인스턴스를 포함하는 MOF 파일을 만듭니다. 관리자만 __Win32Provider 또는__ProviderRegistration서 파생된 클래스의 인스턴스를 만들어 공급자를 등록하거나 삭제할 수 있습니다.

  3. 호스팅 모델의 값에 따라 __Win32Provider의 인스턴스에서 HostingModel을 설정합니다.

    참고

    공급자가 LocalSystem 계정의 높은 권한을 요구하지 않는 한 __Win32Provider.HostingModel 속성을 "NetworkServiceHost"로 설정해야 합니다. 자세한 내용은 공급자 호스팅 및 보안을 참조하세요.

     

    전체 예제에서 다음 MOF 예제는 __Win32Provider 인스턴스를 만드는 코드를 보여줍니다.

    instance of __Win32Provider as $Reg
    {
    Name = "RegProv";        
    CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
    HostingModel = "NetworkServiceHost:LocalServiceHost";
    };
    
  4. 공급자의 논리적 구현을 설명하기 위해 __ProviderRegistration 직접 또는 간접적으로 파생된 클래스의 인스턴스입니다. 여러 가지 유형의 기능에 공급자를 등록할 수 있습니다. 위의 예제에서는 RegProv를 인스턴스 및 메서드 공급자로 등록합니다. 그러나 RegProv가 이 기능을 지원하는 경우 속성 또는 이벤트 공급자로 등록될 수도 있습니다. 다음 표에는 공급자 기능을 등록하는 클래스가 나열되어 있습니다.

    공급자 등록 클래스 설명
    __InstanceProviderRegistration 인스턴스 공급자를 등록합니다.
    __EventProviderRegistration 트 공급자를 등록합니다.
    __EventConsumerProviderRegistration 이벤트 소비자 공급자를 등록합니다.
    __MethodProviderRegistration 메서드 공급자를 등록합니다.
    __PropertyProviderRegistration 속성 공급자를 등록합니다.

     

  5. MOF 파일을 영구 디렉터리에 배치합니다.

    일반적으로 공급자의 설치 디렉터리에 파일을 배치해야 합니다.

  6. mofcomp 또는 IMofCompiler 인터페이스를 사용하여 MOF 파일을 컴파일합니다.

    자세한 내용은 MOF 파일 컴파일을 참조하세요.

    Windows 8 및 Windows Server 2012: 공급자를 설치할 때 mofcompIMofCompiler 인터페이스 둘 다 실제 값에 관계없이 [Key] 및 [Static] 한정자를 true로 처리합니다. 그 밖의 다른 한정자는 있긴 하나 명시적으로 true로 설정되지 않았다면 false로 취급됩니다.

WMI 공급자 개발

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

공급자 보안