次の方法で共有


プロバイダーの登録

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

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

 

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

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

異なる種類のプロバイダー機能のすべてについて、プロバイダーは登録されている必要があります。 ほぼすべてのプロバイダーは、定義するクラスのインスタンスを提供しますが、プロパティ データ、メソッド、イベント、またはクラスを提供することもできます。 プロバイダーは、イベント コンシューマー プロバイダーまたはパフォーマンス カウンター プロバイダーとして登録することもできます。 各種類に対して複数のプロバイダーを個別に用意するのではなく、すべてのプロバイダーの機能を1つのプロバイダーに統合することをお勧めします。 たとえば、メソッドとインスタンスを提供する System Registry プロバイダーと、インスタンス、メソッド、およびイベントを提供する ディスク クォータ プロバイダーがあります。

プロバイダーは、その提供するすべての種類の機能に対して登録されなければなりません。 ほぼすべてのプロバイダーは、定義するクラスのインスタンスを提供しますが、プロパティ データ、メソッド、イベント、またはクラスを提供することもできます。 プロバイダーは、イベント コンシューマー プロバイダーまたはパフォーマンス カウンター プロバイダーとして登録することもできます。

登録の種類ごとに、 __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 プロバイダー の開発

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

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