この記事の内容
このトピックでは、Windows PowerShell ドライブを介してデータ ストアにアクセスする方法を提供する Windows PowerShell ドライブ プロバイダーを作成する方法について説明します。 この種類のプロバイダーは、Windows PowerShell ドライブ プロバイダーとも呼ばれます。 プロバイダーによって使用される Windows PowerShell ドライブは、データ ストアに接続する手段を提供します。
ここで説明する Windows PowerShell ドライブ プロバイダーは、Microsoft Access データベースへのアクセスを提供します。 このプロバイダーの場合、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 から派生します。 セッション固有の初期化情報を追加し、プロバイダーによって使用されるリソースを解放するための機能を実装するには、「基本的な Windows PowerShell プロバイダーの作成を参照してください。 ただし、ほとんどのプロバイダー (ここで説明するプロバイダーを含む) では、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
返します。このメソッドは、メソッドに渡されたドライブ情報またはプロバイダー固有のバージョンを返します。
ドライブ プロバイダーでサポートされている 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* メソッドをオーバーライドしません。 ただし、次のコードは、空のドライブ コレクションを返す既定の実装を示しています。
すべてのドライブ プロバイダーは、ユーザーが検出しやすくするためにルート ドライブをマウントする必要があります。 ルート ドライブには、他のマウントされたドライブのルートとして機能する場所が一覧表示される場合があります。 たとえば、Active Directory プロバイダーは、ルート分散システム環境 (DSE) の namingContext
属性で見つかった名前付けコンテキストを一覧表示するドライブを作成できます。 これは、ユーザーが他のドライブのマウント ポイントを検出するのに役立ちます。
完全なサンプル コードについては、AccessDbProviderSample02 コード サンプルを参照してください。
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> (mydbGet-PSDrive) を します。接続
次の出力が表示されます。
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 プロバイダーの を設計する
PowerShell に関するフィードバック
PowerShell はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。