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.
En este tema se describe cómo crear un proveedor de unidades de Windows PowerShell que proporciona una manera 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 usadas 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 número 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 las filas de las tablas.
Definición de la clase de proveedor de Windows PowerShell
El proveedor de unidades debe definir una clase .NET que derive de la clase base System.Management.Automation.Provider.DriveCmdletProvider. Esta es la definición de clase para este proveedor de unidades:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
Observe que en este ejemplo, el atributo System.Management.Automation.Provider.CmdletProviderAttribute especifica un nombre descriptivo para el proveedor y las funcionalidades 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 funcionalidades del proveedor se definen mediante la enumeración System.Management.Automation.Provider.ProviderCapabilities. Este proveedor de unidades no admite ninguna de estas funcionalidades.
Definición de la funcionalidad base
Tal y como se describe en Diseñar el proveedor de Windows PowerShell, la clase base System.Management.Automation.Provider.DriveCmdletProvider deriva de la clase base System.Management.Automation.Provider.CmdletProvider que define los métodos necesarios para inicializar y anular la inicialización del proveedor. Para implementar la funcionalidad para agregar información de inicialización específica de la sesión y para liberar recursos que usa el proveedor, consulte Creación de un proveedor básico de Windows PowerShell. Sin embargo, la mayoría de los proveedores (incluido el proveedor descrito aquí) pueden usar la implementación predeterminada de esta funcionalidad proporcionada por Windows PowerShell.
Creación de información de estado de unidad
Todos los proveedores de Windows PowerShell se consideran sin estado, lo que significa que el proveedor de unidades debe crear cualquier información de estado que necesite el entorno de ejecución de Windows PowerShell cuando llame al 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. Este es el 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
Creación de una unidad
Para permitir que el entorno de ejecución de Windows PowerShell cree una unidad, el proveedor de unidades debe implementar el método System.Management.Automation.Provider.DriveCmdletProvider.NewDrive*. El código siguiente 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 invalidación de este método debe hacer lo siguiente:
Compruebe que el miembro System.Management.Automation.PSDriveinfo.Root* existe y que se puede realizar una conexión al almacén de datos.
Cree una unidad y rellene el miembro de conexión, en compatibilidad 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 de rendimiento o confiabilidad necesaria, o proporcione datos adicionales para los autores de llamadas mediante la unidad.
Controle los errores mediante el método System.Management.Automation.Provider.CmdletProvider.WriteError y, a continuación, devuelva
null
.Este método devuelve la información de unidad que se pasó al método o a una versión específica del proveedor.
Adjuntar parámetros dinámicos a NewDrive
El cmdlet New-PSDrive
compatible con el 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 invalida este método. Sin embargo, el código siguiente muestra la implementación predeterminada de este método:
Quitar una unidad
Para cerrar la conexión de base de datos, el proveedor de unidades 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 código siguiente 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 se puede quitar la unidad, el método debe devolver la información que se pasa 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, a continuación, devolver null
. Si el proveedor no invalida este método, la implementación predeterminada de este método solo devuelve la información de unidad pasada como entrada.
Inicialización de unidades predeterminadas
El 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 el equipo está unido a un dominio.
Este método devuelve una colección de información de unidad sobre 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 llame al método System.Management.Automation.Provider.CmdletProvider.Start* para inicializar el proveedor.
Este proveedor de unidades no invalida el método System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives*. Sin embargo, el código siguiente muestra la implementación predeterminada, que devuelve una colección de unidades vacía:
Cosas que recordar sobre la implementación de InitializeDefaultDrives
Todos los proveedores de unidades deben montar una unidad raíz para ayudar al usuario a detectar. La unidad raíz podría enumerar las ubicaciones que sirven como raíces para otras unidades montadas. Por ejemplo, el proveedor de Active Directory podría crear una unidad que muestre los contextos de nomenclatura que se encuentran en los atributos de namingContext
en el entorno del sistema distribuido (DSE) raíz. Esto ayuda a los usuarios a detectar puntos de montaje para otras unidades.
Ejemplo de código
Para obtener código de ejemplo completo, consulte ejemplo de código AccessDbProviderSample02.
Probar el proveedor de unidades de Windows PowerShell
Cuando el proveedor de Windows PowerShell se ha registrado con Windows PowerShell, puede probarlo ejecutando los cmdlets admitidos en la línea de comandos, incluidos los cmdlets disponibles por derivación. Vamos a probar el proveedor de unidades de ejemplo.
Ejecute el cmdlet
Get-PSProvider
para recuperar la lista de proveedores para asegurarse de que el proveedor de unidades de AccessDB está presente:PS>
Get-PSProvider
Aparece 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 parte orígenes de datos de de la Herramientas administrativas para el sistema operativo. En la tabla DSN de usuario, haga doble clic en ms Access Database y agregue la ruta de acceso de unidad
C:\ps\northwind.mdb
.Cree una nueva unidad con el proveedor de unidades de ejemplo:
New-PSDrive -Name mydb -Root C:\ps\northwind.mdb -PSProvider AccessDb`
Aparece la siguiente salida:
Name Provider Root CurrentLocation ---- -------- ---- --------------- mydb AccessDB C:\ps\northwind.mdb
Valide la conexión. Dado que la conexión se define como miembro de la unidad, puede comprobarla mediante el cmdlet Get-PDDrive.
Nota:
El usuario aún no puede interactuar con el proveedor como unidad, ya que el proveedor necesita 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). de conexión
Aparece 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 :
Quite la unidad y salga del shell:
PS> Remove-PSDrive mydb PS> exit
Véase también
creación de proveedores de Windows PowerShell