SMP の開発
WMI プロバイダー
ストレージ管理プロバイダー (SMP) インターフェイスは WMI ベースです。 WMI v1 を使用して SMP を記述することもできますが、C/C++ を使用して WMI v2 プロバイダーを作成することを強くお勧めします。 .NET プラットフォームを介していくつかの重要な機能を使用できない可能性があるため、SMP 開発に .NET Framework を使用することはお勧めしません。 さらに:
- WMI v1 は COM に大きく依存しており、学習が困難で時間がかかる場合があります。
- WMI v2 は、WMI v1 よりも業界標準に近い位置にあります。WMI v2 では、DCOM ではなく WS-Management が使用されます。
- プロバイダーは、WMI v2 でより優れたエラー/イベントを利用できます。
- プロバイダーは、WMI v2 の PowerShell 拡張機能と統合を利用できます。
開発リソースのチェックリスト
アイテム | Location | Note |
---|---|---|
基本クラスの MOF ファイル: Storagewmi_provider.mof と、ファイル名に "msft_" で始まるすべての MOF ファイル。 | Windows Software Development Kit (SDK) | %SDK_Installed_Location%\Windows Kits\x.x\Include\um の下 |
その他の必須 MOF ファイル: qualifiers.mof および CIM_Error.mof | 分散管理タスク フォース: http://dmtf.org/standards/cim | これらのファイルは、Microsoft が定義していないファイルです。 |
ヘッダー ファイル: mi.h | Windows SDK | %SDK_Installed_Location%\Windows Kits\x.x\Include\um の下 |
プロバイダー スケルトン生成ツールと .dll ファイル: Convert-MofToProvider.exe | Windows SDK | %SDK_Installed_Location%\Windows Kits\x.x\bin\x64\ または ...\bin\x86 |
プロバイダー登録ツール: Register-CimProvider.exe | %OS_Install_Path%\Windows\System32\ |
MOF の定義
最初の SMP 開発は、次の 3 つの簡単な手順で行われます。
- プロバイダー MOF を拡張します。
- プロバイダースケルトン (またはスタブ) を生成します。
- スタブを実装します。
プロバイダー MOF の拡張
SMP MOF は、Windows SDK インクルード フォルダーにあります。 プレフィックスには MSFT_* が付いています。 これらのファイルを、CIM_Error.mof と qualifiers.mof と共に開発ディレクトリにコピーします。 各 MOF は、SMP のベースを形成する 1 つ以上の抽象クラスを定義します。
他の言語と同様に、抽象クラスを直接実装することはできません。 分離された実装クラスで派生して実装する必要があります。 独自の MOF を作成し、関連するすべてのプロバイダー MOF を含めます。 次に、プロバイダーが実装する基底クラスごとに派生クラスを作成します。 クラスの一意のプレフィックスを選択する必要があります。 たとえば、"Contoso Storage Inc" という名前の会社の場合、 クラスの前に CONTOSO_* または CSI_* を付けます。 たとえば、MSFT_StorageProviderの場合、プレフィックス "CONTOSO_" を指定すると、CONTOSO_StorageProviderが生成されます。 このクラスは以下のようになります。
class CONTOSO_StorageProvider : MSFT_StorageProvider
{
...
}
これらのスケルトン クラスを作成したら、実装する予定のメソッドのすべてのメソッド宣言をコピーする必要があります。 (実装されているかどうかに関係なく) コピーされていないすべてのメソッドは、MI_RESULT_NOT_SUPPORTEDを返します。 クラスのプロパティをコピーする必要はありません。 MOF コンパイル エラーを最小限に抑えるには、メソッドとパラメーターのすべての修飾子を保持します。
最後に、MOF の先頭に次の行を必ず含めます。
#pragma include("storagewmi_provider.mof")
#pragma include("msft_qualifiers.mof")
手順 1 を完了すると、Convert-MofToProvider.exeを使用してプロバイダー スタブを生成する準備ができました。 このコマンドに入力を指定する場合は、必ず派生クラスのみを指定する必要があります。 基底クラスのヘッダーは暗黙的に生成されます。
SMP の MOF の例を参照してください。
プロバイダー スケルトンの生成
SMP 開発者は、WMI SDK のConvert-MofToProvider.exe ツールを使用して、プロバイダースケルトン プロジェクトを生成できます。 このプロジェクトには、WMI プロバイダー メソッドで事前に入力されたヘッダーファイルと C ソース ファイルの一覧が含まれています。 これらのメソッドの実装を提供することで、開発者はストレージ ハードウェアのサポートを提供できます。
”開発リソース チェックリスト” セクションのすべての MOF と、作成した MOF を 1 つのフォルダーに配置します。 次に、コマンド プロンプトで次のコマンドを使用してプロバイダー スケルトンを生成します (最新の更新オプションについてはヘルプ テキストを参照してください)。
Convert-MofToProvider.exe
-MofFile <path to your provider mof>
-ClassList <list of ALL classes listed in your mof, space separated>
-IncludePath <path to qualifiers.mof and CIM_Error.mof>
-SkipQualifiers
-SkipLocalize
最後に、mi.h ヘッダー ファイルを開発プロジェクトに含めます。
推奨される開発シーケンス
StorageProvider、StorageSubSystem、VirtualDisk は必須クラスです。 ストレージ アレイの機能に応じて、StoragePool、ResiliencSetting、PhysicalDisk、MaskingSet、InitiatorId、TargetPort、TargetPortal、OffloadDataTransferSetting、StorageJob は省略可能です。
開発とテストのプロセスを容易にするために、推奨される一連の実装は次のとおりです。
- EnumerateInstances: 必要なクラス StorageProvider、StorageSubSystem、VirtualDisk の基本的なクエリをサポートします。
- GetInstance: GetInstance は、メソッド呼び出しを含む多くの WMI 操作に必要です。
- Create*/DeleteObject: プロバイダーがサポートするオブジェクトのすべての作成および削除メソッドを実装します。
- オブジェクトの関連付け: 関連付けを使用すると、配列オブジェクト間をすばやく簡単に走査できます。 実装には、アソシエーター クラスの EnumerateInstances、AssociatorsOf、ReferencesOf が必要です。 アシエーターの GetInstance は必要ありませんが、ソース オブジェクトとコピー先オブジェクトの GetInstance は必須です。
- 表示: インジケーターを使用すると、プロバイダーは変更について管理アプリケーションに通知できます。
- メソッドのリメインダー。
プロバイダーの登録
コマンド プロンプトを起動します。 次のコマンドを使って、プロバイダーを登録します。
Register-CimProvider.exe
–Namespace root\Microsoft\Windows\Storage\Providers
–ProviderName <name of your provider>
–Path <path to your provider’s dll file>