Crear un proveedor de unidades de Windows PowerShell
Este tema describe cómo crear un proveedor de unidades de Windows PowerShell que proporciona una forma de acceder a un almacén de datos a través de una unidad de Windows PowerShell. Este tipo de proveedor también se conoce como proveedores de unidades de Windows PowerShell. Las unidades de Windows PowerShell utilizadas por el proveedor proporcionan los medios para conectarse al almacén de datos.
El proveedor de unidades de Windows PowerShell que se describe aquí proporciona acceso a una base de datos de Microsoft Access. Para este proveedor, la unidad de Windows PowerShell representa la base de datos (es posible agregar cualquier cantidad de unidades a un proveedor de unidades), los contenedores de nivel superior de la unidad representan las tablas de la base de datos y los elementos de los contenedores representan el filas en las tablas.
Definición de la clase de proveedor de Windows PowerShell
Su proveedor de unidades debe definir una clase .NET que derive de la clase base System.Management.Automation.Provider.Drivecmdletprovider. Aquí está la definición de clase para este proveedor de unidades:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
Tenga en cuenta 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 tiempo de ejecución de Windows PowerShell durante el procesamiento de comandos. Los valores posibles para las capacidades del proveedor están definidos por la enumeración System.Management.Automation.Provider.Providercapabilities. Este proveedor de unidades no admite ninguna de estas capacidades.
Definición de la funcionalidad básica
Como se describe en Diseño de su proveedor de Windows PowerShell, 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 la funcionalidad para agregar información de inicialización específica de la sesión y liberar recursos que utiliza el proveedor, consulte Creación de un proveedor básico de Windows PowerShell. Sin embargo, la mayoría de los proveedores (incluido el proveedor que se describe aquí) pueden usar la implementación predeterminada de esta funcionalidad proporcionada por Windows PowerShell.
Creación de información sobre el estado de la unidad
Todos los proveedores de Windows PowerShell se consideran sin estado, lo que significa que su proveedor de unidades debe crear cualquier información de estado que necesite el tiempo de ejecución de Windows PowerShell cuando llama a su proveedor.
Para este proveedor de unidades, la información de estado incluye la conexión a la base de datos que se mantiene como parte de la información de la unidad. 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 una unidad
Para permitir que el tiempo 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
La anulación de este método debería hacer lo siguiente:
Verifique que el miembro System.Management.Automation.PSDriveinfo.Root* exista y que se pueda establecer una conexión con el almacén de datos.
Cree una unidad y complete el miembro de conexión, compatible con el cmdlet
New-PSDrive.Valide el objeto System.Management.Automation.PSDriveinfo para la unidad propuesta.
Modifique el objeto System.Management.Automation.PSDriveinfo que describe la unidad con cualquier información requerida sobre rendimiento o confiabilidad, o proporcione datos adicionales para las personas que llaman que usan la unidad.
Maneje las fallas usando el método System.Management.Automation.Provider.Cmdletprovider.WriteError y luego devuelva
null.Este método devuelve la información de la unidad que se pasó al método o una versión específica del proveedor.
Adjuntar parámetros dinámicos a NewDrive
El cmdlet New-PSDrive admitido por su proveedor de unidades 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 similares a una clase de cmdlet o un objeto System.Management.Automation.Runtimedefinedparameterdictionary.
Este proveedor de unidades no anula este método. Sin embargo, el siguiente código muestra la implementación predeterminada de este método:
Quitar una unidad
Para cerrar la conexión de la base de datos, el proveedor de la unidad debe implementar el método System.Management.Automation.Provider.Drivecmdletprovider.Removedrive*. Este método cierra la conexión a la unidad después de 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 unidades:
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 se puede quitar, el método debe devolver la información pasada al método a través del parámetro drive. Si no se puede quitar la unidad, el método debe escribir una excepción y luego devolver null. Si su proveedor no anula este método, la implementación predeterminada de este método simplemente devuelve la información de la unidad pasada como entrada.
Inicializando unidades predeterminadas
Su proveedor de unidades implementa el método System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives* para montar unidades. Por ejemplo, el proveedor de Active Directory podría montar una unidad para el contexto de nomenclatura predeterminado si la computadora está unida a un dominio.
Este método devuelve una colección de información de las unidades inicializadas o una colección vacía. La llamada a este método se realiza después de que el tiempo de ejecución de Windows PowerShell llama al método System.Management.Automation.Provider.Cmdletprovider.Start* para inicializar el proveedor.
Este proveedor de unidades 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 unidades vacía:
Cosas para recordar sobre la implementación de InitializeDefaultDrives
Todos los proveedores de unidades deben montar una unidad raíz para ayudar al usuario con la capacidad de descubrimiento. La unidad raíz puede enumerar ubicaciones que sirven como raíces para otras unidades montadas. Por ejemplo, el proveedor de Active Directory podría crear una unidad que enumere los contextos de nombres que se encuentran en los atributos namingContext en el entorno del sistema distribuido (DSE) raíz. Esto ayuda a los usuarios a descubrir puntos de montaje para otras unidades.
Ejemplo de código
Para obtener un código de muestra completo, consulte Ejemplo de código de AccessDbProviderSample02.
Prueba del proveedor de unidades de Windows PowerShell
Cuando su proveedor de Windows PowerShell se haya registrado en Windows PowerShell, puede probarlo ejecutando los cmdlets admitidos en la línea de comandos, incluidos los cmdlets disponibles mediante derivación. Probemos el proveedor de unidades de muestra.
Ejecute el cmdlet
Get-PSProviderpara recuperar la lista de proveedores y asegurarse de que el proveedor de la unidad AccessDB esté presente:PS>
Get-PSProviderAparece el siguiente resultado:
Name Capabilities Drives ---- ------------ ------ AccessDB None {} Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess {C, Z} Function ShouldProcess {function} Registry ShouldProcess {HKLM, HKCU}Asegúrese de que exista un nombre de servidor de base de datos (DSN) para la base de datos accediendo a la parte Fuentes de datos de las Herramientas administrativas del sistema operativo. En la tabla DSN de usuario, haga doble clic en Base de datos de MS Access y agregue la ruta de la unidad
C:\ps\northwind.mdb.Cree una nueva unidad utilizando el proveedor de unidades de muestra:
new-psdrive -name mydb -root c:\ps\northwind.mdb -psprovider AccessDb`Aparece el siguiente resultado:
Name Provider Root CurrentLocation ---- -------- ---- --------------- mydb AccessDB c:\ps\northwind.mdbValidar la conexión. Debido a que la conexión está definida como miembro de la unidad, puede verificarla usando el cmdlet Get-PDDrive.
Nota
El usuario aún no puede interactuar con el proveedor como unidad, ya que el proveedor necesita la funcionalidad de contenedor para esa interacción. Para obtener más información, consulte Creación de un proveedor de contenedores de Windows PowerShell.
PS> (get-psdrive mydb).conexión
Aparece el siguiente resultado:
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 :Retire la unidad y salga del shell:
PS> remove-psdrive mydb PS> exit
Ver también
Crear proveedores de Windows PowerShell
Diseñe su proveedor de Windows PowerShell
Crear un proveedor básico de Windows PowerShell