Compartir a través de


Creación de un proveedor de unidades PowerShell para Windows

Este tema describe cómo crear un proveedor de unidades PowerShell para Windows que permita acceder a un almacén de datos a través de una unidad PowerShell de Windows. Este tipo de proveedor también se conoce como proveedores de unidades Windows PowerShell. Las unidades PowerShell de Windows utilizadas por el proveedor proporcionan los medios para conectarse al almacén de datos.

El proveedor de unidades PowerShell de Windows descrito aquí proporciona acceso a una base de datos de Microsoft Access. Para este proveedor, la unidad PowerShell de Windows representa la base de datos (es posible añadir cualquier número de unidades a un proveedor de unidad), los contenedores de nivel superior de la unidad representan las tablas de la base de datos y los elementos de los contenedores representan las filas de las tablas.

Definición de la clase de proveedor PowerShell de Windows

Tu proveedor de discos debe definir una clase .NET que derive de la clase base System.Management.Automation.Provider.DriveCmdletProvider . Aquí está la definición de clase de este proveedor de unidades:

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider

Observa que en este ejemplo, el atributo System.Management.Automation.Provider.CmdletProviderAttribute especifica un nombre fácil de usar para el proveedor y las capacidades específicas de Windows PowerShell que el proveedor expone al entorno de ejecución de Windows PowerShell durante el procesamiento de comandos. Los valores posibles para las capacidades del proveedor se definen mediante la enumeración System.Management.Automation.Provider.ProviderCapabilities . Este proveedor de discos no soporta ninguna de estas capacidades.

Definición de la funcionalidad base

Como se describe en Design Your Windows PowerShell Provider, la clase System.Management.Automation.Provider.DriveCmdletProvider deriva de la clase base System.Management.Automation.Provider.CmdletProvider que define los métodos necesarios para inicializar y desinicializar el proveedor. Para implementar funcionalidades para añadir información de inicialización específica de la sesión y para liberar recursos que utiliza el proveedor, véase Creación de un proveedor básico de PowerShell para Windows. Sin embargo, la mayoría de los proveedores (incluido el que se describe aquí) pueden utilizar la implementación predeterminada de esta funcionalidad que ofrece Windows PowerShell.

Creación de información sobre el estado del disco

Todos los proveedores de Windows PowerShell se consideran sin estado, lo que significa que tu proveedor de disco debe crear cualquier información de estado que el entorno de ejecución de Windows PowerShell necesite cuando llame a tu proveedor.

Para este proveedor de discos, la información de estado incluye la conexión a la base de datos que se mantiene como parte de la información del disco. Aquí hay un código que muestra cómo se almacena esta información en el objeto System.Management.Automation.PSDriveinfo que describe la unidad:

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

Creando un impulso

Para permitir que el entorno de ejecución de Windows PowerShell cree una unidad, el proveedor de la unidad debe implementar el método System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* . El siguiente código muestra la implementación del método System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* para este proveedor de unidades:

      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

Tu anulación de este método debe hacer lo siguiente:

Adjuntación de parámetros dinámicos a NewDrive

El New-PSDrive cmdlet soportado por tu proveedor de disco puede requerir parámetros adicionales. Para adjuntar estos parámetros dinámicos al cmdlet, el proveedor implementa el método System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters* . Este método devuelve un objeto que tiene propiedades y campos con atributos de análisis similar a una clase cmdlet o a un objeto System.Management.Automation.RuntimeDefinedParameterDictionary .

Este proveedor de discos no anula este método. Sin embargo, el siguiente código muestra la implementación predeterminada de este método:

Eliminando un disco

Para cerrar la conexión a la base de datos, el proveedor de disco debe implementar el método System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* . Este método cierra la conexión con el disco tras limpiar cualquier información específica del proveedor.

El siguiente código muestra la implementación del método System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* para este proveedor de discos:

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

Si la unidad puede eliminarse, el método debería devolver la información que se le pasa a través del drive parámetro. Si la unidad no puede eliminarse, el método debe escribir una excepción y luego devolver null. Si tu proveedor no anula este método, la implementación predeterminada de este método simplemente devuelve la información del disco que se ha pasado como entrada.

Inicialización de unidades predeterminadas

Tu proveedor de discos implementa el método System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* para montar discos. Por ejemplo, el proveedor de Active Directory podría montar una unidad para el contexto de nombres predeterminado si el ordenador está unido a un dominio.

Este método devuelve una colección de información de la unidad sobre las unidades inicializadas, o una colección vacía. La llamada a este método se realiza después de que el entorno de ejecución de Windows PowerShell llame al método System.Management.Automation.Provider.CmdletProvider.Start* para inicializar el proveedor.

Este proveedor de discos no anula el método System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* . Sin embargo, el siguiente código muestra la implementación predeterminada, que devuelve una colección de discos vacía:

Cosas a recordar sobre la implementación de InitializeDefaultDrives

Todos los proveedores de discos deberían montar un disco raíz para ayudar al usuario con la capacidad de descubrimiento. El disco raíz podría listar ubicaciones que sirven como raíces para otros discos montados. Por ejemplo, el proveedor de Active Directory podría crear una unidad que liste los contextos de nombres encontrados en los namingContext atributos del Entorno de Sistema Distribuido raíz (DSE). Esto ayuda a los usuarios a descubrir puntos de montaje para otros discos.

Ejemplo de código

Para el código de ejemplo completo, consulte Ejemplo de código AccessDbProviderSample02.

Probando el proveedor de unidades PowerShell de Windows

Cuando tu proveedor de PowerShell para Windows esté registrado en Windows PowerShell, puedes probarlo ejecutando los cmdlets compatibles en la línea de comandos, incluyendo cualquier cmdlet disponible por derivación. Probemos el proveedor de muestras de despecho.

  1. Ejecuta el Get-PSProvider cmdlet para recuperar la lista de proveedores y asegurarte de que el proveedor de la unidad AccessDB está presente:

    P.D>Get-PSProvider

    Se mostrará la siguiente salida:

    Name                 Capabilities                  Drives
    ----                 ------------                  ------
    AccessDB             None                          {}
    Alias                ShouldProcess                 {Alias}
    Environment          ShouldProcess                 {Env}
    FileSystem           Filter, ShouldProcess         {C, Z}
    Function             ShouldProcess                 {function}
    Registry             ShouldProcess                 {HKLM, HKCU}
    
  2. Asegúrese de que existe un nombre de servidor de base de datos (DSN) para la base de datos accediendo a la sección de Fuentes de Datos de las Herramientas Administrativas del sistema operativo. En la tabla DSN de usuario , haz doble clic en MS Access Database y añade la ruta C:\ps\northwind.mdbde la unidad .

  3. Crea una nueva unidad usando el proveedor de la unidad de muestra:

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

    Se mostrará la siguiente salida:

    Name     Provider     Root                   CurrentLocation
    ----     --------     ----                   ---------------
    mydb     AccessDB     C:\ps\northwind.mdb
    
  4. Valide la conexión. Como la conexión se define como un miembro de la unidad, puedes comprobarlo usando el cmdlet Get-PDDrive.

    Nota:

    El usuario aún no puede interactuar con el proveedor como un disco, ya que el proveedor necesita funcionalidad de contenedor para esa interacción. Para más información, véase Creación de un proveedor de contenedores para Windows PowerShell.

    PD> (Get-PSDrive mydb). Conexión

    Se mostrará la siguiente salida:

    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. Quita el disco y sal de la carcasa:

    PS> Remove-PSDrive mydb
    PS> exit
    

Véase también

Creación de proveedores PowerShell para Windows

Diseña tu proveedor PowerShell para Windows

Creando un proveedor básico de PowerShell para Windows