Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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:
Verifica que el miembro System.Management.Automation.PSDriveinfo.Root * exista y que se pueda establecer una conexión con el almacén de datos.
Crea una unidad y rellena el miembro de conexión, en apoyo al
New-PSDrivecmdlet.Valida el objeto System.Management.Automation.PSDriveinfo para la unidad propuesta.
Modifica el objeto System.Management.Automation.PSDriveinfo que describe la unidad con cualquier información de rendimiento o fiabilidad requerida, o proporciona datos adicionales para los llamantes que usen la unidad.
Gestiona los fallos usando el método System.Management.Automation.Provider.CmdletProvider.WriteError y luego devuelve
null.Este método devuelve la información del disco que se ha pasado al método o una versión específica del proveedor.
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.
Ejecuta el
Get-PSProvidercmdlet para recuperar la lista de proveedores y asegurarte de que el proveedor de la unidad AccessDB está presente:P.D>
Get-PSProviderSe 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}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 .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.mdbValide 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 :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