Partilhar via


Criação de um Fornecedor de Unidades PowerShell para Windows

Este tópico descreve como criar um fornecedor de unidades Windows PowerShell que forneça uma forma de aceder a um armazenamento de dados através de uma unidade Windows PowerShell. Este tipo de fornecedor também é referido como fornecedores de unidades PowerShell do Windows. Os drives PowerShell do Windows usados pelo fornecedor fornecem os meios para se ligar ao armazenamento de dados.

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

Definição da Classe de Fornecedor Windows PowerShell

O seu fornecedor de drive deve definir uma classe .NET que derive da classe base System.Management.Automation.Provider.DriveCmdletProvider . Aqui está a definição da classe para este fornecedor de discos:

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

Note que, neste exemplo, o atributo System.Management.Automation.Provider.CmdletProviderAttribute especifica um nome amigável para o fornecedor e as capacidades específicas do Windows PowerShell que este expõe ao tempo de execução do Windows PowerShell durante o processamento de comandos. Os valores possíveis para as capacidades do fornecedor são definidos pela enumeração System.Management.Automation.Provider.ProviderCapabilities . Este fornecedor de discos não suporta nenhuma destas capacidades.

Definição da Funcionalidade Base

Como descrito em Design Your Windows PowerShell Provider, a classe System.Management.Automation.Provider.DriveCmdletProvider deriva da classe base System.Management.Automation.Provider.CmdletProvider que define os métodos necessários para inicializar e desinicializar o fornecedor. Para implementar funcionalidades para adicionar informação de inicialização específica da sessão e para libertar recursos usados pelo fornecedor, veja Criar um Fornecedor Básico de PowerShell para Windows. No entanto, a maioria dos fornecedores (incluindo o fornecedor descrito aqui) pode usar a implementação padrão desta funcionalidade fornecida pelo Windows PowerShell.

Criação de Informação sobre o Estado do Disco

Todos os fornecedores de PowerShell do Windows são considerados sem estado, o que significa que o seu fornecedor de disco precisa de criar qualquer informação de estado necessária pelo runtime do Windows PowerShell ao contactar o seu fornecedor.

Para este fornecedor de disco, a informação de estado inclui a ligação à base de dados que é mantida como parte da informação do disco. Aqui está o código que mostra como esta informação é armazenada no objeto System.Management.Automation.PSDriveinfo 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 Motivação

Para permitir que o runtime do Windows PowerShell crie uma unidade, o fornecedor de disco deve implementar o método System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* . O código seguinte mostra a implementação do método System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* para este fornecedor 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

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

Anexação de Parâmetros Dinâmicos ao NewDrive

O New-PSDrive cmdlet suportado pelo teu fornecedor de disco pode exigir 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 objeto System.Management.Automation.RuntimeDefinedParameterDictionary .

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

Remover um Disco

Para fechar a ligação à base de dados, o fornecedor do disco deve implementar o método System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* . Este método fecha a ligação ao disco depois de eliminar qualquer informação específica do fornecedor.

O código seguinte mostra a implementação do método System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* para este fornecedor 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

Se a unidade puder ser removida, o método deve devolver a informação passada ao método através do drive parâmetro. Se o disco não puder ser removido, o método deve escrever uma exceção e depois devolver null. Se o seu fornecedor não sobrescrever este método, a implementação padrão deste método apenas devolve a informação do disco passada como entrada.

Inicialização de Discos Padrão

O seu fornecedor de discos implementa o método System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* para montar discos. Por exemplo, o fornecedor do Active Directory pode montar uma unidade para o contexto de nomenclatura padrão se o computador estiver ligado a um domínio.

Este método devolve uma coleção de informação dos discos sobre os discos inicializados, ou uma coleção vazia. A chamada a este método é feita depois de o runtime do Windows PowerShell chamar o método System.Management.Automation.Provider.CmdletProvider.Start* para inicializar o fornecedor.

Este fornecedor de discos não sobrepõe o método System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* . No entanto, o código seguinte mostra a implementação padrão, que devolve uma coleção de discos vazio:

Coisas a Lembrar Sobre a Implementação do InitializeDefaultDrives

Todos os fornecedores de discos devem montar um disco raiz para ajudar o utilizador na descoberta. O disco raiz pode listar locais que servem como raiz para outros discos montados. Por exemplo, o fornecedor do Active Directory pode criar uma unidade que lista os contextos de nomenclatura encontrados nos namingContext atributos do Ambiente de Sistema Distribuído raiz (DSE). Isto ajuda os utilizadores a descobrir pontos de montagem para outros discos.

Exemplo de código

Para código de exemplo completo, consulte AccessDbProviderSample02 Code Sample.

Testando o Fornecedor de Unidades Windows PowerShell

Quando o seu fornecedor Windows PowerShell estiver registado no Windows PowerShell, pode testá-lo executando os cmdlets suportados na linha de comandos, incluindo quaisquer cmdlets disponibilizados por derivação. Vamos testar o fornecedor do sample drive.

  1. Execute o Get-PSProvider cmdlet para recuperar a lista de fornecedores e garantir que o fornecedor do disco AccessDB está presente:

    PS>Get-PSProvider

    A seguinte saída é exibida:

    Name                 Capabilities                  Drives
    ----                 ------------                  ------
    AccessDB             None                          {}
    Alias                ShouldProcess                 {Alias}
    Environment          ShouldProcess                 {Env}
    FileSystem           Filter, ShouldProcess         {C, Z}
    Function             ShouldProcess                 {function}
    Registry             ShouldProcess                 {HKLM, HKCU}
    
  2. Assegure que existe um nome de servidor de base de dados (DSN) para a base de dados, acedendo à secção de Fontes de Dados das Ferramentas Administrativas do sistema operativo. Na tabela do User DSN , clique duas vezes na MS Access Database e adicione o caminho C:\ps\northwind.mdbdo disco .

  3. Crie um novo disco usando o fornecedor de unidades de exemplo:

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

    A seguinte saída é exibida:

    Name     Provider     Root                   CurrentLocation
    ----     --------     ----                   ---------------
    mydb     AccessDB     C:\ps\northwind.mdb
    
  4. Valida a ligação. Como a ligação é definida como um membro da unidade, pode verificá-la usando o cmdlet Get-PDDrive.

    Observação

    O utilizador ainda não pode interagir com o fornecedor como um disco, pois o fornecedor precisa de funcionalidade de contentor para essa interação. Para mais informações, consulte Criar um Fornecedor de Contentores Windows PowerShell.

    PS> (Get-PSDrive mydb). Ligação

    A seguinte saída é exibida:

    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. Remova o disco e saia da carcaça:

    PS> Remove-PSDrive mydb
    PS> exit
    

Ver também

Criação de Fornecedores Windows PowerShell

Desenhe o Seu Fornecedor de PowerShell para Windows

Criação de um Fornecedor Básico de PowerShell para Windows