创建 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 cmdlet 可能需要其他参数。 若要将这些动态参数附加到 cmdlet,提供程序将实现 System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters* 方法。 此方法返回一个对象,该对象具有与 cmdlet 类或 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 后,可以通过在命令行上运行受支持的 cmdlet 来测试它,包括派生提供的任何 cmdlet。 让我们测试示例驱动器提供程序。

  1. 运行 Get-PSProvider cmdlet 以检索提供程序列表,以确保 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 数据库 并添加驱动器路径 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 cmdlet 对其进行检查。

    注释

    用户尚不能以驱动器的形式与提供程序交互,因为提供程序需要容器功能进行该交互。 有关详细信息,请参阅 创建 Windows PowerShell 容器提供程序

    PS>(Get-PSDrive mydb)。连接

    将显示以下输出:

    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. 删除驱动器并退出 shell:

    PS> Remove-PSDrive mydb
    PS> exit
    

另请参阅

创建 Windows PowerShell 提供程序

设计 Windows PowerShell 提供程序

创建基本 Windows PowerShell 提供程序