英語で読む

次の方法で共有


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 から派生します。 セッション固有の初期化情報を追加し、プロバイダーによって使用されるリソースを解放するための機能を実装するには、「基本的な 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

このメソッドのオーバーライドでは、次の操作を行う必要があります。

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 に登録されている場合は、サポートされているコマンドレットをコマンド ラインで実行してテストできます。これには、派生によって使用可能になったコマンドレットも含まれます。 サンプル ドライブ プロバイダーをテストしてみましょう。

  1. 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}
    
  2. オペレーティング システムの 管理ツールデータ ソース 部分にアクセスして、データベースのデータベース サーバー名 (DSN) が存在することを確認します。 ユーザー DSN テーブルで、MS Access Database ダブルクリックし、ドライブ パス C:\ps\northwind.mdb追加します。

  3. サンプル ドライブ プロバイダーを使用して新しいドライブを作成します。

    New-PSDrive -Name mydb -Root C:\ps\northwind.mdb -PSProvider AccessDb`
    

    次の出力が表示されます。

    Name     Provider     Root                   CurrentLocation
    ----     --------     ----                   ---------------
    mydb     AccessDB     C:\ps\northwind.mdb
    
  4. 接続を検証します。 接続はドライブのメンバーとして定義されているため、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         :
    
  5. ドライブを取り外し、シェルを終了します。

    PS> Remove-PSDrive mydb
    PS> exit
    

こちらもご覧ください

Windows PowerShell プロバイダーの作成

Windows PowerShell プロバイダーの を設計する

基本的な Windows PowerShell プロバイダー の作成