Solaris WBEM SDK 開発ガイド

第 4 章 プロバイダプログラムの作成

この章では、プロバイダプログラムの作成方法について説明します。内容は次のとおりです。


注 -

WBEM プロバイダ API (javax.wbem.provider) についての詳細は、/usr/sadm/lib/wbem/doc/index.html を参照してください。


プロバイダについて

プロバイダは、データにアクセスするために、ディスクドライブおよび CPU などの管理リソースと通信する特別なクラスです。プロバイダは、統合と解釈を行うためにデータを CIM Object Manager に送ります。WBEM リソースの固有のサブセットの管理作業を引き継ぐことにより、Solaris WBEM Services を調整する主 WBEM エージェントである CIM Object Manager を取得できます。プロバイダは、javax.wbem.provider API を使用してこのデータを転送します。CIM Object Manager Repository で使用できないアプリケーションからデータの要求を受け取ると、CIM Object Manager は、プロバイダインタフェースを使用して、その要求を適切なプロバイダに送ります。

Solaris ソフトウェアプロバイダは、ユーザー、グループ、別名、役割、ファイルシステム、ディスク、プロセス、複製ツール、ネットワーク構成、プロダクト登録、デバイスおよびシステム性能モニターなど、さまざまな領域に存在します。

プロバイダでは、クラス (インスタンスのテンプレートとして使用する) ではなく、「インスタンス」を作成、変更、および削除します。インスタンスは、永続的な記憶領域に設定できますが、動的に使用することもできます。

プロバイダは、独自のプロセスおよびメモリーを持ち、CIM Object Manager に委託された作業を実行しますが、CIM Object Manager では、WBEM の調整作業を実行するために各プロバイダの位置を把握する必要があります。MOF ファイルに新規または変更されたプロバイダを含めることにより、CIM Object Manager にプロバイダの情報を知らせることができます。MOF ファイルは、プロバイダがサポートするクラスおよびインスタンスを定義します。MOF ファイルを登録するには、mofcomp (1M) コマンドを使用します。

プロバイダは、次の処理を実行します。


注 -

プロバイダと CIM Object Manager は、同じコンピュータに置く必要があります。


プロバイダのデータソース

プロバイダは、次のソースからデータを取得します。

プロバイダの種類

プロバイダは扱うことができるサービス要求の種類によって分類されます。クライアントプログラムは、クライアント API を介して CIM Object Manager と通信 (および WBEM データにアクセス) します (/usr/sadm/lib/wbem/doc/index.html を参照)。CIM Object Manager は、プロバイダメソッドをクライアント API の対応するクライアントメソッドにマップします。ただし、引数リストおよび対応するメソッドの戻り値は次のように異なる場合があります。

使用するメソッドおよびクラスの引数リストおよび戻り値が正しいかどうか確認してください。

次の表に Solaris WBEM SDK プロバイダの種類を示します。

表 4-1 プロバイダの種類

種類 

クラス名 

説明 

インスタンス 

CIMInstanceProvider

所定のクラスの動的なインスタンスを提供する。インスタンスの取得、列挙、変更、削除をサポートする 

メソッド 

MethodProvider

1 つ以上のクラスのメソッドを供給する 

アソシエータ 

CIMAssociatorProvider

動的な関連クラスのインスタンスを供給する 

インジケーション 

EventProvider

CIM イベントのインジケーションを処理する 

承認 

なし 

マーカーインタフェースは、プロバイダが独自に承認検査を行うことを CIM Object Manger に知らせる 

関連するメソッドを登録および実装することにより、単一のプロバイダを前述の 1 つ以上の種類のプロバイダとして使用できます。

プロバイダ名の命名規約

プロバイダは、単一の Java クラスに含めることができます。また各プロバイダをそれぞれのクラスに分けて保存することもできます。プロバイダ名は、クラスのプロバイダとなる Java クラスを識別します。現時点では、CIM Object Manager は、Java 言語で記述されたプロバイダのみサポートします。

プロバイダ名およびクラス名は、次の規約に従う必要があります。


注 -

Java 言語でプロバイダが記述されていることを CIM Object Manager に通知するために、「java:」をすべてのプロバイダ修飾子の前に付ける必要があります。


標準の Java クラスおよびパッケージ命名規則に従って、プロバイダ名を作成します。パッケージ名の接頭辞は、小文字の ASCII 文字で最上位のドメイン名 (comedugov milnetorg) 、または ISO 標準 3166、1981 で指定されている英語 2 文字の国名コードにする必要があります。

パッケージ名のあとに続く名前は、組織内部の命名規則によって異なります。組織内部の規則では、ディレクトリ名のコンポーネントとして、部名、課名、プロジェクト名、マシン名、あるいはログイン名などを指定します。たとえば、プロバイダ名 java:com.sun.wbem.cimom は、次の要素を示します。

プロバイダインタフェースの実装

プロバイダの作成時には、プロバイダがサポートするインタフェースを指定する必要があります。プロバイダがサポートする各インタフェースのすべてのメソッドを実装してください。またすべてのプロバイダには、 CIMProvider インタフェースを実装する必要があります。プロバイダインタフェースには、次の 2 つのメソッドがあります。

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

次のコード例は、 Ex_SimpleCIMInstanceProvider クラスの enumerateInstances および getInstance インタフェースを実装します。わかりやすくするために、この例では、CIMException をスローすることによって deleteInstancecreateInstancesetInstanceexecQuery の各インタフェースを実装します。


注 -

execQuery メソッドの実装についての詳細は、「照会の構文解析」を参照してください。



例 4-1 CIMInstance プロバイダ

/*
 * "@(#)SimpleCIMInstanceProvider.java"
 */
import javax.wbem.cim.*;
import javax.wbem.client.*;
import javax.wbem.provider.CIMProvider;
import javax.wbem.provider.CIMInstanceProvider;
import javax.wbem.provider.MethodProvider;
import java.util.*;
import java.io.*;

public class SimpleCIMInstanceProvider implements CIMInstanceProvider{
     static int loop = 0;
     public void initialize(CIMOMHandle cimom) throws CIMException {
     }
     public void cleanup() throws CIMException {
     }
     public CIMObjectPath[] enumerateInstanceNames(CIMObjectPath op, 
                                                   CIMClass cc) 
     throws CIMException {
                return null;
     }
     /*
      * enumerateInstances:
      * 名前だけでなくインスタンス全体が返される
      */
     public CIMInstance[] enumerateInstances(CIMObjectPath op,
                          boolean localOnly,boolean includeQualifiers,
                          boolean includeClassOrigin,String[] 
                          propertyList, CIMClass cc) throws CIMException
     {
     if (op.getObjectName().equalsIgnoreCase\
                            ("Ex_SimpleCIMInstanceProvider")) 
             {
             Vector instances = new Vector();
             CIMInstance ci = cc.newInstance();
                 if (loop == 0){
                     ci.setProperty("First", new CIMValue("red"));
                     ci.setProperty("Last", new CIMValue("apple"));
                     // 要求されたプロパティのみ含める
       ci = ci.filterProperties(propertyList, includeQualifier,
       includeClassOrigin);
                     instances.addElement(ci);
                     loop += 1;
                 } else {
                     ci.setProperty("First", new CIMValue("red"));
                     ci.setProperty("Last", new CIMValue("apple"));
                     // 要求されたプロパティのみ含める
         ci = ci.filterProperties(propertyList, includeQualifier,
         includeClassOrigin);
                     instances.addElement(ci);
                     ci = cc.newInstance();
                     ci.setProperty("First", new CIMValue("green"));
                     ci.setProperty("Last", new CIMValue("apple"));
                     // 要求されたプロパティのみ含める
       ci = ci.filterProperties(propertyList, includeQualifier,
       includeClassOrigin);
                     instances.addElement(ci);
                 }
             return (CIMInstance[])instances.toArray();
             }
         throw new CIMException(CIM_ERR_INVALID_CLASS);
     }

     public CIMInstance getInstance(CIMObjectPath op, boolean localOnly,
     boolean includeQualifiers, boolean includeClassOrigin,
     String[] propertyList, CIMClass cc) ) throws CIMException {
             if (op.getObjectName().equalsIgnoreCase
                             ("Ex_SimpleCIMInstanceProvider"))
             {
                 CIMInstance ci = cc.newInstance();
    // passed in オブジェクトパスからキーを取得する必要がある
    // 取得したいインスタンスを一意に識別する
    java.util.Vector keys = cop.getKeys();
    // この例は一般的でないので、単にキーをインスタンスに
    // 配置して実行する
                 ci.setProperties(keys);
    // ほかにキー以外のプロパティがある場合には、ここに追加する

                 // 要求されたプロパティのみ含める
    ci = ci.filterProperties(propertyList, includeQualifiers,
    includeClassOrigin);
                 return ci;
             }
            throw new CIMException(CIM_ERR_INVALID_CLASS);
      }

     public CIMInstance[] execQuery(CIMObjectPath op, \
                            String query, String ql, CIMClass cc)
           throws CIMException {
           throw(new CIMException(CIMException.CIM_ERR_NOT_SUPPORTED));
    }

     public void setInstance(CIMObjectPath op, CIMInstance ci, boolean 
                             includeQualifiers, String[] propertyList)
           throws CIMException {
           throw(new CIMException(CIMException.CIM_ERR_NOT_SUPPORTED));
    }

     public CIMObjectPath createInstance(CIMObjectPath op, CIMInstance ci)
              throws CIMException {
           throw(new CIMException(CIMException.CIM_ERR_NOT_SUPPORTED));
    }

     public void deleteInstance(CIMObjectPath cp) throws CIMException {
         throw(new CIMException(CIMException.CIM_ERR_NOT_SUPPORTED));
     }
 }


メソッドプロバイダの作成

クライアントプログラムで Solaris WBEM プロバイダのメソッドを呼び出すには、メソッド invokeMethod を使用する以外には他の方法はありません。次のいずれかのプロバイダを使用します。

次のコード例は、CIM Object Manager からの要求を 1 つ以上の特化されたプロバイダに配信する Solaris_ComputerSystem プロバイダクラスを作成します。これらの特化されたプロバイダは、特定の管理対象オブジェクトの動的データの要求に対するサービスを行います。たとえば、Solaris_Package プロバイダは、Solaris_Package クラスのメソッドを実行する要求に対応します。

メソッドプロバイダは、invokeMethod という単一のメソッドを実装します。このメソッドは、システムのリブート、システムの停止、またはシリアルポートの削除のいずれかの処理を実行する適切なプロバイダを呼び出します。


例 4-2 メソッドプロバイダ

...
public class Solaris_ComputerSystem implements MethodProvider {
	ProviderCIMOMHandle pch = null;
	public void initialize(CIMOMHandle ch) throws CIMExcepiton {
		pch = (ProviderCIMOMHandle)ch;
	}

	public void cleanup() throws CIMException {
	}

	public CIMValue invokeMethod(CIMObjectPath op, String methodName,
			Vector inParams, Vector outParams)  throws CIMException {
		if (op.getObjectName().equalsIgnoreCase("solaris_computersystem")) {
			if (methodName.equalsIgnoreCase("reboot")) {
				// ヘルパー関数を呼び出す (ここには表示されていない)
				return new CIMValue(rebootSystem());
			}
			if (methodName.equalsIgnoreCase("shutdown")) {
				// ヘルパー関数を呼び出す (ここには表示されていない)
				return new CIMValue(shutdownSystem());
			}
		}
		if (op.getObjectName().equalsIgnoreCase("solaris_serialport")) {
			if (methodName.equalsIgnoreCase("disableportservice")) {
				// ヘルパー関数を呼び出す (ここには表示されていない)
				return new CIMValue(deletePort(op));
			}
		}
		// エラー
		throw new CIMException(CIMException.CIM_ERR_NOT_SUPPORTED,
			"The requested function does not exist");
	}
	// 以下にヘルパー関数が定義される
	...
}

アソシエータプロバイダの作成


注 -

クライアントプログラム (CIMObjectPath ) によって呼び出される関連メソッドの objectName 引数は、クラスではなくインスタンスのオブジェクトパスである必要があります。


インスタンスのオブジェクトパスが指定されていない場合、CIM Object Manager は、クライアントが CIM Object Manager Repository の関連 (関連のメンバーインスタンスが派生するテンプレート) のクラス定義を必要としているとみなします。プロバイダではなく、クライアント API の関連メソッドを使用します。

関連を設計およびコーディングする場合に最も重要な部分は、関連クラスそのものです。作成する関連は、関連クラスのコンテンツ以上には複雑になりません。関連のメンバー数は、関連クラスの参照数に等しくなります。役割は、さらに複雑な関連をモデル化する場合に使用できます。次に関連クラスの例を示します。

次のコード例では associators メソッドを実装します。CIM Object Manager は、associatorNamesobjectNameroleresultRoleincludeQualifiersincludeClassOrigin、および propertyList のそれぞれの値を関連プロバイダに渡します。また CIM 関連クラスの名前と、返される関連オブジェクトが属する CIM クラスまたはインスタンスを出力します。このプロバイダは、example_teacher クラスと example_student クラスのインスタンスを扱います。


例 4-3 CIMAssociator プロバイダ

...

public CIMInstance[] associators(CCIMObjectPath assocName, CIMObjectPath 
                objectName, String resultClass, String role, String
                resultRole, boolean includeQualifiers, boolean 
                includeClassOrigin, String[] propertyList)
                throws CIMException {
        System.out.println("Associators "+assocName+" "+objectName);
      if (objectName.getObjectName()equalsIgnoreCase("example_teacher")) {
      Vector v = new Vector();
      if ((role != null)  && (!role.equalsIgnoreCase("teaches"))) {
        // Teacher は、teaches という役割だけを担う
            return v;
        }
        if ((resultRole != null)  && (!resultRole.equalsIgnoreCase
                                     ("taughtby"))) {
        // Teacher は、taughtby という役割によってのみ得られる
        return v;
        }
        // Teacher のアソシエータを取得する
        CIMProperty nameProp = (CIMProperty)objectName.getKeys().elementAt
                               (0);
        String name = (String)nameProp.getValue().getValue();
        // Student のクラスを取得する
        CIMObjectPath tempOp = new CIMObjectPath("example_student");
        tempOp.setNameSpace(assocName.getNameSpace());
        CIMClass cc = cimom.getClass(tempOp, false);
        // objectName によって渡されたインスタンス名をテストし、Student 
        // クラスの関連インスタンスを返す
        if(name.equals("teacher1")) {
                // teacher1 の Student (複数) を取得する
                CIMInstance ci = cc.newInstance();
                ci.setProperty("name", new CIMValue("student1"));
                v.addElement(ci.filterProperties(propertyList, 
                             includeQualifiers,
                        includeClassOrigin));
                ci = cc.newInstance();
                ci.setProperty("name", new CIMValue("student2"));
                v.addElement(ci.filterProperties(propertyList,
                        includeQualifiers, includeClassOrigin));
                return v;
        }
}

インジケーションプロバイダの作成

CIM イベントのインジケーションを生成するには、次の処理を実行します。

イベントインジケーションを生成する方法
  1. EventProvider インタフェースを実装します。

    たとえば、次のようになります。

    public class sampleEventProvider implements 
            InstanceProvider EventProvider{
    
        // プロバイダが CIM Object Manager に接続するための参照
        private ProviderCIMOMHandle cimom;
       }

  2. プロバイダが処理するインスタンスインジケーションに対して、表 4–2 に示すそれぞれのメソッドを実行します。

  3. 作成、変更、および削除インスタンスイベントのそれぞれの種類に対してインジケーションを作成します。

    以下に createInstance メソッドの例を示します。

    public CIMObjectPath createInstance(CIMObjectPath op, 
            CIMInstance ci)
        throws CIMException {
            CIMObjectpath newop = ip.createInstance(op, ci);
            CIMInstance indication = new CIMInstance();
            indication.setClassName("CIM_InstCreation");
            CIMProperty cp = new CIMProperty();
            cp.setName("SourceInstance");
            cp.setValue(new CIMValue(ci));
            Vector v = new Vector();
            v.addElement(cp);
            indication.setProperties(v);
            ...
        }

  4. イベントインジケーションを CIM Object Manager に配信します。

    cimom.deliverEvent(op.getNameSpace(), indication);

イベントプロバイダメソッド

イベントプロバイダは、EventProvider インタフェースを実装します。CIM Object Manager は、このインタフェースのメソッドを使って、クライアントが CIM イベントのインジケーションを予約したり、CIM イベントの予約を取り消したことをプロバイダに知らせます。さらにこれらのメソッドによって、プロバイダは、CIM Object Manager が特定のイベントインジケーションのポーリングを行うべきかどうか、インジケーションをハンドラに返すことを承認するかどうかを指定します。

次の表に、イベントプロバイダで実装する必要のある EventProvider インタフェースのメソッドを示します。

表 4-2 EventProvider メソッド

メソッド 

説明 

activateFilter

クライアントが予約を作成すると、CIM Object Manager は、このメソッドを呼び出して CIM イベントの検査をプロバイダに依頼する 

authorizeFilter

クライアントが予約を作成すると、CIM Object Manager は、このメソッドを呼び出して指定されたフィルタ式が許可されているかを検査する 

deActivateFilter

クライアントが予約を削除すると、CIM Object Manager は、このメソッドを呼び出して指定されたイベントフィルタの停止をプロバイダに依頼する 

mustPoll

クライアントが予約を作成すると、CIM Object Manager は、このメソッドを呼び出して、指定されたフィルタ式をプロバイダが許可するかどうか、そのフィルタ式のポーリングが必要かどうかを検査する 

CIM Object Manager は、すべてのメソッドに次の引数の値を渡します。

さらに、activateFilter メソッドは、これがこのイベントの種類の最初のフィルタであることを示すブール値 firstActivation を受け取ります。deActivateFilter メソッドは、これが最後のフィルタであることを示すブール値 lastActivation を受け取ります。

インジケーションの作成と配信

クライアントアプリケーションが CIM_IndicationSubscription クラスのインスタンスを作成して CIM イベントのインジケーションを予約すると、CIM Object Manager はこの要求を適切なプロバイダに転送します。プロバイダが EventProvider インタフェースを実装していれば、CIM Object Manager は、プロバイダの activateFilter メソッドを呼び出して、指定するイベントのインジケーションの送信をいつ開始するかをプロバイダに通知します。また、CIM Object Manager は、プロバイダの deActivateFilter メソッドを呼び出して、指定するイベントのインジケーションの送信をいつ停止するかをプロバイダに通知します。

プロバイダは、インスタンスを作成、変更、削除するたびに、インジケーションを作成、配信して、CIM Object Manager の要求に応答します。通常、プロバイダは、CIM Object Manager が activateFilter メソッドを呼び出した時に設定し、deActivateFilter メソッドを呼び出した時にクリアされるフラグ変数を定義します。そのあと、インスタンスを作成、変更、または削除するメソッドの中で、動作中のフラグの状態を検査します。フラグが設定されている場合、プロバイダは、作成した CIM インスタンスオブジェクトを含むインジケーションを作成し、deliverEvent メソッドを使用してこのインジケーションを CIM Object Manager に返します。フラグが設定されていない場合、プロバイダは、イベントインジケーションの作成や配信を行いません。

プロバイダは、activateFilter メソッドが呼び出されると、インジケーションの配信を開始します。プロバイダは、CIM_Indication の concrete (具象) サブクラスのインスタンスを作成し、ProviderCIMOMHandled.deliverIndication メソッドを起動します。CIM Object Manager は、インジケーションを受信し、そのインジケーションを適切なインジケーションハンドラに配信します。プロバイダは、複数の種類のイベントを処理できます。たとえば、サイクルインジケーションの場合、プロバイダは CIM_InstCreationCIM_InstDeletion、および CIM_InstModification を処理できます。

予約者が設定した種類を監視する場合、プロバイダは activateFilter および deActivateFilter 呼び出しにそれぞれ渡された firstActivation および lastActivation フラグを使用できます。firstActivation フラグは、特定のイベントの種類をはじめて予約した場合には、true になります。同様に lastActivation は、特定のイベントの種類の最後の予約を削除すると、true になります。これらのフラグを検査すると、プロバイダは、指定したイベントの種類を監視するために簡単にリソースを割り当てたり、割り当てを解除したりすることができます。

承認について

機密データを扱うプロバイダは、インジケーションの要求に対する承認を検査することができます。その場合、プロバイダは Authorizable インタフェースを実装して、そのプロバイダが承認を検査することを示す必要があります。また、プロバイダは authorizeFilter メソッドを実装する必要があります。CIM Object Manager は、authorizeFilter メソッドを呼び出して、イベントハンドラの所有者 (UID) がフィルタ式の評価に基づいて返されるインジケーションの受信を承認されているかどうかを検査します。イベントの宛先の所有者 (イベントハンドラ) の UID は、フィルタを動作中にするように要求するクライアントアプリケーションの所有者と同じである必要はありません。

ネイティブプロバイダの作成

プロバイダは、管理対象デバイスに関する情報の取得と設定を行います。ネイティブプロバイダは、特定の管理対象デバイスに特化して作成されたプログラムです。たとえば、Solaris システム上のデータにアクセスするプロバイダには、通常、システムを照会するために C 関数が含まれます。

ネイティブプロバイダは、一般に次のような理由で作成されます。

JDK の一部である JNI (Java Native Interface) は、Java のネイティブプログラミングインタフェースです。JNI を使用してプログラムを作成すると、ほとんどのプラットフォームで完全に移植可能です。Java 仮想マシン (JVM) で動作する Java コードで JNI を使用すると、そのコードは C、C++、アセンブラのようなほかの言語で作成されたアプリケーションおよびライブラリで実行できます。

Java プログラムの作成、および Java プログラムとネイティブメソッドの統合についての詳細は、Java Web サイト http://java.sun.com を参照してください。

プロバイダの作成

次の手順に従ってプロバイダを作成します。

  1. プロバイダプログラムを作成または編集します。

  2. Java プログラムをコンパイルしてクラスファイルを作成します。

  3. 共有オブジェクトファイル (.so) を /usr/sadm/lib/wbem にコピーします。

  4. CLASSPATH.class および .jar ファイルがある場所に設定します。

  5. プロバイダを登録します。

プロバイダの CLASSPATH を設定する方法

プロバイダの CLASSPATH を設定して、CIM Object Manager に .class および .jar ファイルの保存場所を知らせます。

  1. Solaris_ProviderPath クラスのインスタンスを作成します。

    たとえば、次のようになります。

    /* root\system (名前空間名) で初期化された名前空間オブジェクトを
    ローカルホスト上に作成する  */   
    CIMNameSpace cns = new CIMNameSpace("", "root\system"); 
    
    // root\system 名前空間にスーパーユーザーとして接続する
    cc = new CIMClient(cns, "root", "root_password");
    
    // Solaris_ProviderPath クラスを取得する
    cimclass = cc.getClass(new CIMObjectPath("Solaris_ProviderPath");
    
    // Solaris_ProviderPath の新しいインスタンスを作成する
    class ci = cimclass.newInstance();

  2. 標準的な URL 形式を使用して、pathurl プロパティにファイルの場所を設定します。

    たとえば、次のようになります。

    /* プロバイダの CLASSPATH に /myhome/myproviders を設定する*/
    ci.setProperty("pathurl", new CIMValue(new String
                              ("file:///myhome/myproviders/"))); 

    標準的な URL 形式を次の表に示します。

    プロバイダの CLASSPATH

    標準 URL 形式 

    ディレクトリへの絶対パス 

    file:///a/b/c/

    .jar ファイルへの絶対パス

    file:///a/b/my.jar

  3. インスタンスを作成します。

    たとえば、次のようになります。

    // 更新されたインスタンスを CIM Object Manager に渡す 
    cc.createInstance(new CIMObjectPath(), ci);  

プロバイダを登録する方法

サポートするデータと操作についての情報を通信するため、またプロバイダの位置を CIM Object Manager に通知するため、CIM Object Manager に新しいプロバイダまたは変更されたプロバイダを登録します。CIM Object Manager は、この情報を使用してプロバイダの読み込みと初期化、および特定のクライアント要求に適切なプロバイダを決定します。

  1. プロバイダがサポートするクラスを定義するファイルを作成します。


    注 -

    MOF ファイルの作成方法の詳細については、DMTF Web サイト http://www.dmtf.org を参照してください。


  2. MOF ファイルにプロバイダ修飾子を含めて、CIM Object Manager のプロバイダの種類と場所を指定します。

    たとえば、次のようになります。

    [Provider("java:com.sun.providers.myprovider")]
    Class_name {
    ...
    };

    この修飾子は、次の要素を示します。

    • java: – Java 言語で記述され、javax.wbem.provider インタフェースを実装するプロバイダ

    • com.sun.providers.myprovider – プロバイダを実装する Java クラス名

  3. mofcomp(1M) コマンドを使用して、MOF ファイルをコンパイルします。


例 4-4 プロバイダの登録

次の MOF ファイルには、Ex_SimpleCIMInstanceProvider クラスのプロバイダとして SimpleCIMInstanceProvider が宣言されています。

// ========================================================
// タイトル:       SimpleCIMInstanceProvider
// ファイル名:    SimpleCIMInstanceProvider.mof
// 説明:
// ==================================================================

// ==================================================================
// Pragmas
// ==================================================================
#pragma Locale ("en-US")

// ==================================================================
//   SimpleCIMInstanceProvider
// ==================================================================
[Provider("java:SimpleCIMInstanceProvider")]
class Ex_SimpleCIMInstanceProvider
{
   // プロパティ
      [Key, Description("First Name of the User")]
   string First;
      [Description("Last Name of the User")]
   string Last;
};