Creating a Windows PowerShell Drive Provider (Criar um Fornecedor de Unidades do Windows PowerShell)

Este tópico descreve como criar um fornecedor de unidade Windows PowerShell que fornece uma forma de aceder a uma loja de dados através de uma unidade Windows PowerShell. Este tipo de prestador é também referido como Windows PowerShell fornecedores de unidades. As Windows PowerShell unidades utilizadas pelo fornecedor fornecem os meios para se ligar à loja de dados.

O fornecedor de unidade Windows PowerShell descrito aqui fornece acesso a uma base de dados do Microsoft Access. Para este fornecedor, a unidade Windows PowerShell representa a base de dados (é possível adicionar qualquer número de unidades a um fornecedor de unidade), os recipientes de nível superior da unidade representam as tabelas na base de dados, e os itens dos contentores representam as linhas nas tabelas.

Definição da Classe provedora de Windows PowerShell

O seu fornecedor de acionamento deve definir uma classe .NET que deriva da classe base System.Management.Automation.Provider.Drivecmdletprovider. Aqui está a definição de classe para este fornecedor de unidade:

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

Note que, neste exemplo, o atributo System.Management.Automation.Provider.Cmdletproviderattribute especifica um nome fácil de utilizar para o fornecedor e a Windows PowerShell capacidades específicas que o fornecedor expõe ao Windows PowerShell tempo de execução durante o processamento do comando. Os valores possíveis para as capacidades do fornecedor são definidos pela enumeração system.Management.Automation.Provider.Provider.Providercapabilities. Este fornecedor de unidades não suporta nenhuma destas capacidades.

Definição da funcionalidade base

Conforme descrito no Design Your Windows PowerShell Provider, a classe base System.Management.Automation.Provider.Drivecmdletprovider deriva do System.Management.Automation.Provider.Cmdletprovider base class que define os métodos necessários para inicializar e desinfundir o fornecedor. Para implementar a funcionalidade de adição de informações de inicialização específicas da sessão e para a libertação de recursos utilizados pelo fornecedor, consulte criar um Fornecedor de Windows PowerShell Básico. No entanto, a maioria dos fornecedores (incluindo o fornecedor aqui descrito) podem utilizar a implementação padrão desta funcionalidade que é fornecida por Windows PowerShell.

Criação de informações do Estado de unidade

Todos os fornecedores de Windows PowerShell são considerados apátridas, o que significa que o seu fornecedor de unidades precisa de criar qualquer informação do Estado que seja necessária pelo Windows PowerShell tempo de execução quando liga para o seu fornecedor.

Para este fornecedor de unidade, as informações estatais incluem a ligação à base de dados que é mantida como parte da informação de unidade. Aqui está o código que mostra como esta informação é armazenada no sistema.Management.Automation.PSDriveinfo objeto que descreve a unidade:

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

Criar uma Unidade

Para permitir que o Windows PowerShell tempo de funcionamento crie uma unidade, o fornecedor de acionamento deve implementar o método System.Management.Automation.Provider.Drivecmdletprovider.Newdrive*. O seguinte código mostra a implementação do método System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* para este fornecedor de unidade:

      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

A sua sobreposição deste método deve fazer o seguinte:

Anexar parâmetros dinâmicos ao NewDrive

O New-PSDrive cmdlet suportado pelo seu fornecedor de acionamento pode necessitar de parâmetros adicionais. Para anexar estes parâmetros dinâmicos ao cmdlet, o fornecedor implementa o método System.Management.Automation.Provider.Drivecmdletprovider.Newdrivedynamicparameters*. Este método devolve um objeto que tem propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um system.Management.Automation.Runtimedefinedparameterdicary object.

Este fornecedor de acionamento não substitui este método. No entanto, o seguinte código mostra a implementação padrão deste método:

Remoção de uma unidade

Para fechar a ligação à base de dados, o fornecedor de acionamento deve implementar o método System.Management.Automation.Provider.Drivecmdletprovider.Removedrive*. Este método fecha a ligação à unidade após a limpeza de qualquer informação específica do fornecedor.

O seguinte código mostra a implementação do método System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* para este fornecedor de unidade:

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

Se a unidade puder ser removida, o método deve devolver as informações transmitidas ao método através do drive parâmetro. Se a unidade não puder ser removida, o método deve escrever uma exceção e, em seguida, regressar null . Se o seu fornecedor não anular este método, a implementação padrão deste método apenas devolve as informações de unidade passadas como entrada.

Inicialização de unidades padrão

O seu fornecedor de acionamento implementa o método System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives* para montar unidades. Por exemplo, o fornecedor de Diretório Ativo pode montar uma unidade para o contexto de nomeação padrão se o computador estiver associado a um domínio.

Este método devolve uma coleção de informações de unidade sobre as unidades inicializadas, ou uma coleção vazia. A chamada para este método é feita após o Windows PowerShell chamada de tempo de execução do método System.Management.Automation.Provider.Cmdletprovider.Start* para inicializar o fornecedor.

Este fornecedor de acionamento não substitui o método System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives*. No entanto, o seguinte código mostra a implementação predefinitiva, que devolve uma coleção de unidade vazia:

Coisas a lembrar sobre implementar InicializeDefaultDrives

Todos os fornecedores de unidade devem montar uma unidade de raiz para ajudar o utilizador com a descoberta. A unidade de raiz pode listar locais que servem de raízes para outras unidades montadas. Por exemplo, o fornecedor de Diretório Ativo pode criar uma unidade que lista os contextos de nomeação encontrados nos namingContext atributos no ambiente do sistema distribuído raiz (DSE). Isto ajuda os utilizadores a descobrir pontos de montagem para outras unidades.

Amostra de código

Para obter o código de amostra completo, consulte AccessDbProviderSample02 Code Sample.

Testar o Fornecedor de Unidade de Windows PowerShell

Quando o seu fornecedor Windows PowerShell estiver registado com Windows PowerShell, pode testá-lo executando os cmdlets suportados na linha de comando, incluindo quaisquer cmdlets disponibilizados por derivação. Vamos testar o fornecedor de unidade de amostra.

  1. Executar o Get-PSProvider cmdlet para recuperar a lista de fornecedores para garantir a presença do fornecedor de unidade AccessDB:

    > PS Get-PSProvider

    É apresentada a seguinte saída:

    Name                 Capabilities                  Drives
    ----                 ------------                  ------
    AccessDB             None                          {}
    Alias                ShouldProcess                 {Alias}
    Environment          ShouldProcess                 {Env}
    FileSystem           Filter, ShouldProcess         {C, Z}
    Function             ShouldProcess                 {function}
    Registry             ShouldProcess                 {HKLM, HKCU}
    
  2. Certifique-se de que existe um nome de servidor de base de dados (DSN) para a base de dados, acedendo à parte de Fontes de Dados das Ferramentas Administrativas para o sistema operativo. Na tabela DSN do utilizador, clique duas vezes na Base de Dados de Acesso ms e adicione o caminho de unidade C:\ps\northwind.mdb .

  3. Criar uma nova unidade utilizando o fornecedor de unidade de amostragem:

    new-psdrive -name mydb -root c:\ps\northwind.mdb -psprovider AccessDb`
    

    É apresentada a seguinte saída:

    Name     Provider     Root                   CurrentLocation
    ----     --------     ----                   ---------------
    mydb     AccessDB     c:\ps\northwind.mdb
    
  4. Validar a ligação. Como a ligação é definida como um membro da unidade, pode verificar utilizando o Get-PDDrive cmdlet.

    Nota

    O utilizador ainda não pode interagir com o fornecedor como uma unidade, uma vez que o fornecedor necessita de funcionalidade de contentor para essa interação. Para obter mais informações, consulte criar um Fornecedor de Recipientes Windows PowerShell.

    PS> (get-psdrive mydb).connection

    É apresentada a seguinte saída:

    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. Retire a unidade e saia da concha:

    PS> remove-psdrive mydb
    PS> exit
    

Consulte também

Criação de fornecedores de Windows PowerShell

Desenhe o seu fornecedor de Windows PowerShell

Creating a Basic Windows PowerShell Provider (Criar um Fornecedor Básico do Windows PowerShell)