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

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

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> (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         :
    
  5. ドライブを取り外し、シェルを終了します。

    PS> remove-psdrive mydb
    PS> exit
    

参照

サービス プロバイダー Windows PowerShell作成する

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

基本的な Windows PowerShell プロバイダーを作成する