Windows PowerShell ドライブ プロバイダーを作成する
このトピックでは、Windows PowerShell ドライブを介してデータ ストアにアクセスする方法を提供する、Windows PowerShellについて説明します。 この種類のプロバイダーは、ドライブ プロバイダー Windows PowerShell呼ばれます。 プロバイダー Windows PowerShell使用されるデータ ドライブは、データ ストアに接続する手段を提供します。
ここでWindows PowerShellドライブ プロバイダーは、Microsoft Access データベースへのアクセスを提供します。 このプロバイダーの場合、Windows PowerShell ドライブはデータベースを表し (ドライブ プロバイダーに任意の数のドライブを追加できます)、ドライブのトップ レベルのコンテナーはデータベース内のテーブルを表し、コンテナーの項目はテーブル内の行を表します。
プロバイダー クラスWindows PowerShell定義する
ドライブ プロバイダーは 、System.Management.Automation.Provider.Drivecmdletprovider 基本クラスから派生する .NET クラスを定義する必要があります。 このドライブ プロバイダーのクラス定義を次に示します。
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
この例では、System.Management.Automation.Provider.Cmdletproviderattribute属性で、プロバイダーのユーザー に対して使い方の良い名前と、コマンドの処理中にプロバイダーが Windows PowerShell ランタイムに公開する Windows PowerShell 固有の機能を指定しています。 プロバイダー機能に使用できる値は 、System.Management.Automation.Provider.Providercapabilities 列挙体によって定義 されます。 このドライブ プロバイダーでは、これらの機能はサポートされていません。
基本機能の定義
「Windows PowerShellプロバイダーの設計」で説明したように、System.Management.Automation.Provider.Drivecmdletproviderクラスは、プロバイダーの初期化と初期化解除に必要なメソッドを定義するSystem.Management.Automation.Provider.Cmdletprovider基本クラスから派生します。 セッション固有の初期化情報を追加する機能と、プロバイダーによって使用されるリソースを解放する機能を実装するには、「Creating a Basic Windows PowerShell Provider 」を参照してください。 ただし、ほとんどのプロバイダー (ここで説明するプロバイダーを含む) では、この機能の既定の実装を使用できます。この実装は、Windows PowerShell。
ドライブ状態情報の作成
すべての Windows PowerShellプロバイダーはステートレスと見なされます。つまり、ドライブ プロバイダーは、プロバイダーを呼び出す際に Windows PowerShell ランタイムで必要な状態情報を作成する必要があります。
このドライブ プロバイダーの場合、状態情報には、ドライブ情報の一部として保持されるデータベースへの接続が含まれます。 この情報が、ドライブを記述する System.Management.Automation.PSDriveinfo オブジェクトに格納される方法を示すコードを次に示します。
internal class AccessDBPSDriveInfo : PSDriveInfo
{
private OdbcConnection connection;
/// <summary>
/// ODBC connection information.
/// </summary>
public OdbcConnection Connection
{
get { return connection; }
set { connection = value; }
}
/// <summary>
/// Constructor that takes one argument
/// </summary>
/// <param name="driveInfo">Drive provided by this provider</param>
public AccessDBPSDriveInfo(PSDriveInfo driveInfo)
: base(driveInfo)
{ }
} // class AccessDBPSDriveInfo
ドライブの作成
Windows PowerShell ランタイムがドライブを作成するには、ドライブ プロバイダーがSystem.Management.Automation.Provider.Drivecmdletprovider.Newdrive*メソッドを実装する必要があります。 次のコードは、このドライブ プロバイダーの System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* メソッドの実装を示しています。
protected override PSDriveInfo NewDrive(PSDriveInfo drive)
{
// check if drive object is null
if (drive == null)
{
WriteError(new ErrorRecord(
new ArgumentNullException("drive"),
"NullDrive",
ErrorCategory.InvalidArgument,
null)
);
return null;
}
// check if drive root is not null or empty
// and if its an existing file
if (String.IsNullOrEmpty(drive.Root) || (File.Exists(drive.Root) == false))
{
WriteError(new ErrorRecord(
new ArgumentException("drive.Root"),
"NoRoot",
ErrorCategory.InvalidArgument,
drive)
);
return null;
}
// create a new drive and create an ODBC connection to the new drive
AccessDBPSDriveInfo accessDBPSDriveInfo = new AccessDBPSDriveInfo(drive);
OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();
builder.Driver = "Microsoft Access Driver (*.mdb)";
builder.Add("DBQ", drive.Root);
OdbcConnection conn = new OdbcConnection(builder.ConnectionString);
conn.Open();
accessDBPSDriveInfo.Connection = conn;
return accessDBPSDriveInfo;
} // NewDrive
このメソッドのオーバーライドでは、次の操作を行う必要があります。
System.Management.Automation.PSDriveinfo.Root*メンバーが存在し、データ ストアへの接続が可能なのを確認します。
ドライブを作成し、 コマンドレットをサポートする接続メンバーを設定
New-PSDriveします。提案された ドライブの System.Management.Automation.PSDriveinfo オブジェクトを検証します。
必要なパフォーマンスまたは信頼性情報を含むドライブを記述する System.Management.Automation.PSDriveinfo オブジェクトを変更するか、ドライブを使用して呼び出し元に追加のデータを提供します。
System.Management.Automation.Provider.Cmdletprovider.WriteErrorメソッドを使用してエラーを処理し、 を返します
null。このメソッドは、 メソッドに渡されたドライブ情報、またはプロバイダー固有のバージョンのドライブ情報を返します。
NewDrive への動的パラメーターのアタッチ
ドライブ New-PSDrive プロバイダーでサポートされているコマンドレットには、追加のパラメーターが必要になる場合があります。 これらの動的パラメーターをコマンドレットにアタッチするために、プロバイダーは System.Management.Automation.Provider.Drivecmdletprovider.Newdrivedynamicparameters* メソッドを実装します。 このメソッドは、コマンドレット クラスまたは System.Management.Automation.Runtimedefinedparameterdictionary オブジェクトのような解析属性を持つプロパティとフィールドを持つオブジェクトを返します。
このドライブ プロバイダーは、このメソッドをオーバーライドしない。 ただし、次のコードは、このメソッドの既定の実装を示しています。
ドライブの取り外し
データベース接続を閉じるには、ドライブ プロバイダーが System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* メソッドを実装する必要 があります。 このメソッドは、プロバイダー固有の情報をクリーンアップした後、ドライブへの接続を閉じます。
次のコードは、このドライブ プロバイダーの System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* メソッドの実装を示しています。
protected override PSDriveInfo RemoveDrive(PSDriveInfo drive)
{
// check if drive object is null
if (drive == null)
{
WriteError(new ErrorRecord(
new ArgumentNullException("drive"),
"NullDrive",
ErrorCategory.InvalidArgument,
drive)
);
return null;
}
// close ODBC connection to the drive
AccessDBPSDriveInfo accessDBPSDriveInfo = drive as AccessDBPSDriveInfo;
if (accessDBPSDriveInfo == null)
{
return null;
}
accessDBPSDriveInfo.Connection.Close();
return accessDBPSDriveInfo;
} // RemoveDrive
ドライブを削除できる場合、メソッドは パラメーターを使用してメソッドに渡された情報を返す必要 drive があります。 ドライブを削除できない場合、メソッドは例外を書き込み、 を返す必要があります null 。 プロバイダーがこのメソッドをオーバーライドしない場合、このメソッドの既定の実装では、入力として渡されたドライブ情報が返されます。
既定のドライブの初期化
ドライブ プロバイダーは、ドライブをマウント するために System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives* メソッドを実装します。 たとえば、コンピューターがドメインに参加している場合、Active Directory プロバイダーは既定の名前付けコンテキストのドライブをマウントできます。
このメソッドは、初期化されたドライブまたは空のコレクションに関するドライブ情報のコレクションを返します。 このメソッドの呼び出しは、Windows PowerShell ランタイムがSystem.Management.Automation.Provider.Cmdletprovider.Start*メソッドを呼び出してプロバイダーを初期化した後に行います。
このドライブ プロバイダーは 、System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives* メソッドをオーバーライドしません。 ただし、次のコードは、空のドライブ コレクションを返す既定の実装を示しています。
InitializeDefaultDrives の実装に関する注意
すべてのドライブ プロバイダーは、ユーザーが検出可能性を持つのに役立つルート ドライブをマウントする必要があります。 ルート ドライブには、他のマウントされたドライブのルートとして機能する場所が一覧表示される場合があります。 たとえば、Active Directory プロバイダーは、ルート分散システム環境 (DSE) の属性にある名前付けコンテキストを一覧表示するドライブ namingContext を作成できます。 これは、ユーザーが他のドライブのマウント ポイントを検出するのに役立ちます。
コード サンプル
完全なサンプル コードについては 、「AccessDbProviderSample02 コード サンプル」を参照してください。
Windows PowerShell ドライブ プロバイダーのテスト
Windows PowerShell プロバイダーが Windows PowerShell に登録されている場合は、コマンド ラインでサポートされているコマンドレット (派生で使用可能なコマンドレットを含む) を実行してテストできます。 サンプル ドライブ プロバイダーをテストしましょう。
コマンドレットを
Get-PSProvider実行してプロバイダーの一覧を取得し、AccessDB ドライブ プロバイダーが存在する必要があります。PS>
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}オペレーティング システムの管理ツールの [データ ソース] 部分にアクセスして、データベースのデータベース サーバー名 (DSN)が存在 することを確認します。 [ユーザー DSN] テーブル で 、[MS Access Database] をダブルクリックし、ドライブ パス を追加します
C:\ps\northwind.mdb。サンプル ドライブ プロバイダーを使用して新しいドライブを作成します。
new-psdrive -name mydb -root c:\ps\northwind.mdb -psprovider AccessDb`次のような出力が表示されます。
Name Provider Root CurrentLocation ---- -------- ---- --------------- mydb AccessDB c:\ps\northwind.mdb接続を検証します。 接続はドライブのメンバーとして定義されています。そのため、 コマンドレットを使用Get-PDDriveできます。
注意
プロバイダーは、その操作にコンテナー機能を必要とするために、まだドライブとしてプロバイダーと対話できません。 詳細については、「コンテナー プロバイダーの作成」Windows PowerShell参照してください。
PS> (get-psdrive mydb).connection
次のような出力が表示されます。
ConnectionString : Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\ps\northwind.mdb ConnectionTimeout : 15 Database : c:\ps\northwind DataSource : ACCESS ServerVersion : 04.00.0000 Driver : odbcjt32.dll State : Open Site : Container :ドライブを取り外し、シェルを終了します。
PS> remove-psdrive mydb PS> exit
参照
サービス プロバイダー Windows PowerShell作成する
フィードバック
フィードバックの送信と表示