このトピックは、Windows PowerShellプロバイダーの作成方法を学ぶための出発点となります。 ここで説明する基本的なプロバイダーは、プロバイダーの開始および停止の方法を提供しており、このプロバイダーはデータストアへのアクセスやデータの取得・設定手段を提供しませんが、すべてのプロバイダーに必要な基本的な機能を提供します。
前述の通り、ここで述べた基本的なプロバイダーは、プロバイダーの開始および停止の方法を実装しています。 Windows PowerShellランタイムはこれらのメソッドを呼び出してプロバイダの初期化および初期化解除を行います。
注
このプロバイダーのサンプルは、Windows PowerShellが提供するAccessDBSampleProvider01.csファイルで見つけることができます。
Windows PowerShell プロバイダークラスの定義
Windows PowerShellプロバイダーを作成する最初のステップは、その.NETクラスを定義することです。 この基本的なプロバイダーは、System.Management.Automation.Provider.CmdletProviderのベースクラスから派生したAccessDBProviderというクラスを定義しています。
プロバイダークラスはAPI名前空間の Providers 名前空間(例えばxxx.PowerShell.Providers)に配置することが推奨されます。 このプロバイダーは Microsoft.Samples.PowerShell.Provider 名前空間を使用し、すべてのWindows PowerShellプロバイダーサンプルがここで実行されます。
注
WindowsのPowerShellプロバイダーのクラスは明示的に公開としてマークされなければなりません。 パブリックとしてマークされていないクラスはデフォルトで内部に移行し、WindowsのPowerShellランタイムでは検出されません。
以下はこの基本プロバイダーのクラス定義です:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : CmdletProvider
クラス定義の直前に、 System.Management.Automation.Provider.CmdletProviderAttribute 属性を宣言し、構文は [CmdletProvider()]です。
必要に応じて、属性キーワードを設定してクラスをさらに宣言することもできます。 ここで宣言されている System.Management.Automation.Provider.CmdletProviderAttribute 属性には2つのパラメータが含まれていることに注目してください。 最初の属性パラメータは、プロバイダーのデフォルトフレンドリーな名前を指定しており、ユーザーは後でそれを変更できます。 2つ目のパラメータは、コマンド処理中にプロバイダーがWindows PowerShellランタイムに公開するWindowsPowerShell定義の能力を指定します。 プロバイダー能力の可能な値は、 System.Management.Automation.Provider.ProviderCapabilities 列挙によって定義されます。 これはベースプロバイダーなので、機能をサポートしていません。
注
Windows PowerShellプロバイダーの完全限定名には、プロダシオン登録時にWindows PowerShellが決定するアセンブリ名やその他の属性が含まれます。
州情報 Provider-Specific 定義
System.Management.Automation.Provider.CmdletProviderのベースクラスおよびすべての派生クラスは、Windows PowerShellランタイムが必要に応じてのみプロバイダーインスタンスを作成するため、ステートレスと見なされます。 したがって、プロバイダーがプロバイダー固有のデータの完全な制御と状態保守を必要とする場合、 System.Management.Automation.ProviderInfo クラスからクラスを派生させる必要があります。 派生クラスは、状態を維持するために必要なメンバーを定義し、Windows PowerShellランタイムが System.Management.Automation.Provider.Provider.CmdletProvider.Start* メソッドを呼び出してプロバイダを初期化した際にアクセスできるようにすべきです。
Windows PowerShellプロバイダーは接続ベースの状態を維持することも可能です。 接続状態の維持についての詳細は、「 PowerShellドライブプロバイダーの作成」をご覧ください。
プロバイダーの初期化
プロバイダーを初期化するために、Windows PowerShellが起動した際にWindowsPowerShellランタイムは System.Management.Automation.Provider.CmdletProvider.Start* メソッドを呼び出します。 ほとんどの場合、プロバイダーはこのメソッドのデフォルト実装を使用でき、その実装はプロバイダーを記述する System.Management.Automation.ProviderInfo オブジェクトを単純に返します。 ただし、追加の初期化情報を追加したい場合は、自分で System.Management.Automation.Provider.CmdletProvider.Start* メソッドを実装し、 System.Management.Automation.ProviderInfo オブジェクトの修正版を返し、それをプロバイダーに渡す必要があります。 一般的に、このメソッドは渡された System.Management.Automation.ProviderInfo オブジェクト、または他の初期化情報を含む修正された System.Management.Automation.ProviderInfo オブジェクトを返すべきです。
この基本的なプロバイダーはこの方法を上書きしません。 しかし、以下のコードはこのメソッドのデフォルトの実装を示しています:
プロバイダーは 「プロバイダー固有のデータ状態の定義」に記載されているように、プロバイダー固有の情報の状態を維持できます。 この場合、実装は System.Management.Automation.Provider.CmdletProvider.Start* メソッドを上書きして、派生クラスのインスタンスを返す必要があります。
動的パラメータの開始
System.Management.Automation.Provider.CmdletProvider.Start*メソッドのプロバイダー実装は、追加のパラメータを必要とする場合があります。 この場合、プロバイダーは System.Management.Automation.Provider.CmdletProvider.StartDynamicParameters* メソッドをオーバーライドし、コマンドレットクラスや System.Management.Automation.RuntimeDefinedParameterDictionary オブジェクトに似た解析属性を持つプロパティとフィールドを持つオブジェクトを返すべきです。
この基本的なプロバイダーはこの方法を上書きしません。 しかし、以下のコードはこのメソッドのデフォルトの実装を示しています:
プロバイダーの初期化解除
Windows PowerShellプロバイダーが使用するリソースを解放するには、プロバイダー独自の System.Management.Automation.Provider.CmdletProvider.Stop* メソッドを実装すべきです。 このメソッドは、Windows PowerShellランタイムによってセッション終了時にプロバイダーの初期化解除を呼び出されます。
この基本的なプロバイダーはこの方法を上書きしません。 しかし、以下のコードはこのメソッドのデフォルトの実装を示しています:
コード サンプル
完全なサンプルコードについては、 AccessDbProviderSample01 Code Sampleをご覧ください。
Windows PowerShellプロバイダーのテスト
Windows PowerShellプロバイダーがWindows PowerShellに登録されたら、コマンドラインでサポートされているコマンドレットを実行してテストできます。 この基本的なプロバイダーについては、新しいシェルを実行し、 Get-PSProvider コマンドレットを使ってプロバイダーのリストを取得し、AccessDbプロバイダーが存在することを確認します。
Get-PSProvider
次のような出力が表示されます。
Name Capabilities Drives
---- ------------ ------
AccessDb None {}
Alias ShouldProcess {Alias}
Environment ShouldProcess {Env}
FileSystem Filter, ShouldProcess {C, Z}
Function ShouldProcess {function}
Registry ShouldProcess {HKLM, HKCU}