Share via


相互運用のための関連付けプロバイダーの作成

関連付けプロバイダーは、プロファイルを登録し、異なる名前空間に実装されているプロファイルに関連付けるメカニズムを提供します。

関連付けプロバイダーは、電源プロファイルなどの標準プロファイルを公開するために使用されます。 これは、CIM_RegisteredProfile から派生したクラスを実装することによって、関連付けインスタンスを公開する root/interop 名前空間に関連付けプロバイダーを記述することによって実現されます。 クロス名前空間トラバーサルをサポートするには、root/interop 名前空間と root/<implemented> 名前空間の両方にプロバイダーを登録する必要があります。

Windows Management Instrumentation (WMI) は、root/interop 名前空間で関連付けクエリが実行されるたびに、関連付けプロバイダーを読み込みます。

相互運用のための関連付けプロバイダーを実装するには

  1. CIM_RegisteredProfile からクラスを派生させ、root\interop 名前空間にこの派生クラスの静的インスタンスを作成します。 少なくとも、次のプロパティを有効な値と共に伝達する必要があります。

    InstanceIDCIM_RegisteredProfile のインスタンスを一意に定義しますが、RegisteredNameRegisteredOrganizationRegisteredVersion の組み合わせは、組織のスコープ内で登録済みプロファイルを一意に識別する必要があります。 個々のプロパティの詳細については、「CIM_RegisteredProfile」を参照してください。

    次のコード例では、CIM_RegisteredProfile から ProcessProfile クラスを派生させ、静的インスタンスを設定するための構文について説明します。

    class ProcessProfile : CIM_RegisteredProfile
    {
    };
    
    instance of ProcessProfile as $PP
    {
         InstanceID = "Process";
         RegisteredName = "Process";
         RegisteredOrganization = "1"; // Set to "Other"
         OtherRegisteredOrganization = "Microsoft";
         RegisteredVersion = "1.0";
    };
    

    Note

    Windows クライアントの場合、RegisteredOrganization プロパティを 1 に設定し、OtherRegisteredOrganization プロパティを "Microsoft" に設定する必要があります。

     

  2. CIM_ElementConformsToProfile の関連付けインスタンスを返すプロバイダーを作成します。 これは 2 つのステップからなるプロセスです。

    1. 相互運用名前空間と実装名前空間の両方で 、CIM_ElementConformsToProfile から派生したクラスを作成します。 同じプロファイルを異なるベンダーによって実装できるため、クラスの名前は一意である必要があります。 推奨される名前付け規則は、"<Organization>_<ProductName>_<ClassName>_<Version>" です。 ConformantStandard プロパティまたは ManagedElement プロパティは、このクラスが属する名前空間を含む MSFT_TargetNamespace 修飾子を指定する必要があります。

      次のコード例では、root\interop 名前空間の CIM_ElementConformsToProfile から Microsoft_Process_ElementConformsToProfile_v1 クラスを派生させる構文について説明します。 この例では、Win32_Process マネージド要素は、MSFT_TargetNamespace 修飾子を使用して root\cimv2 名前空間を参照します。

      #pragma namespace("\\\\.\\root\\interop")
      [Provider("ProcessAssociation"),Dynamic]
      Class Microsoft_Process_ElementConformsToProfile_v1: CIM_ElementConformsToProfile
      {
           CIM_RegisteredProfile ref ConformantStandard = $PP;
           [MSFT_TargetNamespace("root\\cimv2")]Win32_process ref ManagedElement = null;
      };
      

      次のコード例では、root\cimv2 名前空間の CIM_ElementConformsToProfile から Microsoft_Process_ElementConformsToProfile_v1 クラスを派生させる構文について説明します。 この例では、CIM_RegisteredProfile 準拠標準はMSFT_TargetNamespace 修飾子を使用して root\interop 名前空間を参照します。

      #pragma namespace("\\\\.\\root\\cimv2")
      [Provider("ProcessAssociation"),Dynamic]
      Class Microsoft_Process_ElementConformsToProfile_v1: CIM_ElementConformsToProfile
      {
           [MSFT_TargetNamespace("root\\interop")] CIM_RegisteredProfile ref ConformantStandard = $PP;
           Win32_process ref ManagedElement = null;
      };
      

      実装された名前空間を参照しているプロパティで MSFT_TargetNamespace 修飾子が指定されていない場合、"Associators of" ステートメントの ResultClass フィルターは機能しません。 たとえば、MSFT_TargetNamespace 修飾子が指定されていない場合、次の Windows PowerShell コマンドラインはオブジェクトを返しません。: get-wmiobject -query "associators of {ProcessProfile.InstanceID='Process'} where resultclass='Win32_Process'"

      MSFT_TargetNamespace 修飾子は、リモート コンピューター上の名前空間を指すことはできません。 たとえば、次の名前空間はサポートされていません。 MSFT_TargetNamespace(\\\\<RemoteMachine>\\root\\interop)

    2. 作成された派生クラスのインスタンスを返すプロバイダーを記述します。 詳細については、「インスタンス プロバイダーの作成」を参照してください。 クロス名前空間インスタンスにアクセスする場合は、クライアントのセキュリティ レベルにアクセスする必要がある場合があります。 詳細については、「クライアントの偽装」を参照してください。

      関連付けプロバイダーは IWbemServices.CreateInstanceEnumAsync メソッドと IWbemServices.GetObjectAsync メソッドの両方を実装する必要があります。 IWbemServices.ExecQueryAsync メソッドの実装は省略可能です。 このプロバイダーは root\interop 名前空間と root\<implemented> 名前空間の両方からアクセスできるため、プロバイダー内の名前空間に明示的な依存関係をもつべきではありません。

  3. 関連付けプロバイダーを root\interop と root\<implemented> 名前空間の両方に登録します。 詳細については、「インスタンス プロバイダーの登録」を参照してください。

    次のコード例では、root\interop 名前空間に関連付けプロバイダーを登録する構文について説明します。

    #pragma namespace("\\\\.\\root\\interop")
    instance of __Win32Provider as $P
    {
        Name    = "ProcessAssociation" ;
        ClsId   = "{DA13393B-A2D5-4BAC-9BD2-30B092E9EBB8}";
    } ;
    
    instance of __InstanceProviderRegistration
    {
        Provider = $P;
        SupportsPut = false;
        SupportsGet = TRUE;
        SupportsDelete = false;
        SupportsEnumeration = TRUE;
    };
    

    次のコード例では、root\cimv2 名前空間に関連付けプロバイダーを登録する構文について説明します。

    #pragma namespace("\\\\.\\root\\cimv2")
    instance of __Win32Provider as $R
    {
        Name    = "ProcessAssociation" ;
        ClsId   = "{DA13393B-A2D5-4BAC-9BD2-30B092E9EBB8}";
    } ;
    
    instance of __InstanceProviderRegistration
    {
        Provider = $R;
        SupportsPut = false;
        SupportsGet = TRUE;
        SupportsDelete = false;
        SupportsEnumeration = TRUE;
    };
    
  4. CIM_ElementConformsToProfile のスキーマを実装された名前空間に配置します。 Windows クライアントの場合、これは %systemroot%\system32\wbem フォルダーにある interop.mof ファイルです。

  5. プロバイダーの IWbemProviderInit インターフェイスを実装します。

    WMI では IWbemProviderInit を使用してプロバイダーを読み込んで初期化します。 IWbemProviderInit.Initialize メソッドは、2 つの異なる名前空間について、呼び出しができる方法で実装する必要があります。 詳細については、「プロバイダーの初期化」を参照してください。

CIM_ElementConformsToProfile

CIM_RegisteredProfile

インスタンス プロバイダーの作成

インスタンス プロバイダーの登録