プロバイダーの登録

プロバイダーを実装する前に、まずプロバイダーを WMI に登録する必要があります。 プロバイダーを登録することによって、プロバイダーの種類とプロバイダーがサポートするクラスが定義されます。 登録されたプロバイダーにアクセスできるのは、WMI のみです。

注意

MI プロバイダーの登録の詳細については、「方法: MI プロバイダーを登録する」を参照してください。

 

プロバイダーを登録する前に、プロバイダー コードを記述できます。 ただし、WMI に登録されていないプロバイダーをデバッグすることは非常に困難です。 プロバイダーのインターフェイスを決定することは、プロバイダーの目的と構造の概要を示すのにも役立ちます。 そのため、プロバイダーを登録すると、プロバイダーを設計するのに役立ちます。

プロバイダーを登録または削除できるのは管理者だけです。

プロバイダーが実行するすべての異なる種類のプロバイダー関数に対して、プロバイダーを登録する必要があります。 ほぼすべてのプロバイダーは、定義するクラスのインスタンスを提供しますが、プロパティ データ、メソッド、イベント、またはクラスを提供することもできます。 プロバイダーは、イベント コンシューマー プロバイダーまたはパフォーマンス カウンター プロバイダーとして登録することもできます。 型ごとに多数のプロバイダーを個別に用意するのではなく、1 つのプロバイダーにすべてのプロバイダー機能を結合することをお勧めします。 たとえば、メソッドとインスタンスを提供するシステム レジストリ プロバイダーと、インスタンス、メソッド、イベントを提供するディスク クォータ プロバイダーがあります。

プロバイダーが実行するすべての異なる種類のプロバイダー関数に対して、プロバイダーを登録する必要があります。 ほぼすべてのプロバイダーは、定義するクラスのインスタンスを提供しますが、プロパティ データ、メソッド、イベント、またはクラスを提供することもできます。 プロバイダーは、イベント コンシューマー プロバイダーまたはパフォーマンス カウンター プロバイダーとして登録することもできます。

登録の種類ごとに、__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 のインスタンスと、__ProviderRegistration から直接または間接的に派生したクラスのインスタンス (__InstanceProviderRegistration など) を含む 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 プロバイダーの開発

名前空間セキュリティ記述子の設定

プロバイダーのセキュリティ保護