다음을 통해 공유


공급자 등록

공급자를 구현하기 전에 먼저 공급자를 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. HostingModel__Win32Provider 인스턴스에서 호스팅 모델의 값에 따라 설정합니다.

    메모

    공급자가 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 인스턴스 공급자등록합니다.
    __이벤트제공자등록 이벤트 공급자을 등록합니다.
    __EventConsumerProviderRegistration 이벤트 소비자 공급자등록합니다.
    __MethodProviderRegistration 메서드 공급자등록합니다.
    __PropertyProviderRegistration 속성 공급자를에 등록합니다.

     

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

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

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

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

    Windows 8 및 Windows Server 2012: 공급자를 설치할 때 mofcompIMofCompiler 인터페이스는, 실제 값에 관계없이 [Key] 및 [Static] 한정자가 있는 경우 true로 처리합니다. 다른 한정자는 존재하지만 명시적으로 true로 설정되지 않은 경우 false로 처리됩니다.

WMI 공급자 개발하기

Namespace 보안 설명자 설정

공급자 보안