Criando um provedor de unidade do Windows PowerShell
Este tópico descreve como criar um provedor de unidade do Windows PowerShell que fornece uma maneira de acessar um armazenamento de dados por meio de uma unidade do Windows PowerShell. Esse tipo de provedor também é conhecido como provedores de unidade do Windows PowerShell. As unidades do Windows PowerShell usadas pelo provedor fornecem os meios para se conectar ao armazenamento de dados.
O provedor de unidade do Windows PowerShell descrito aqui fornece acesso a um banco de dados do Microsoft Access. Para esse provedor, a unidade do Windows PowerShell representa o banco de dados (é possível adicionar qualquer número de unidades a um provedor de unidade), os contêineres de nível superior da unidade representam as tabelas no banco de dados e os itens dos contêineres representam as linhas nas tabelas.
Definindo a classe do provedor do Windows PowerShell
Seu provedor de unidade deve definir uma classe .NET que deriva da classe base System.Management.Automation.Provider.DriveCmdletProvider. Aqui está a definição de classe para este provedor de unidade:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
Observe que, neste exemplo, o atributo System.Management.Automation.Provider.CmdletProviderAttribute especifica um nome amigável para o provedor e os recursos específicos do Windows PowerShell que o provedor expõe ao tempo de execução do Windows PowerShell durante o processamento de comandos. Os valores possíveis para os recursos do provedor são definidos pelo System.Management.Automation.Provider.ProviderCapabilities enumeração. Este fornecedor de unidades não suporta nenhuma destas capacidades.
Definindo a funcionalidade básica
Conforme descrito em Projetar seu provedor do Windows PowerShell, 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 provedor. Para implementar a funcionalidade para adicionar informações de inicialização específicas da sessão e para liberar recursos usados pelo provedor, consulte Criando um provedor básico do Windows PowerShell. No entanto, a maioria dos provedores (incluindo o provedor descrito aqui) pode usar a implementação padrão dessa funcionalidade fornecida pelo Windows PowerShell.
Criando informações sobre o estado da unidade
Todos os provedores do Windows PowerShell são considerados sem monitoração de estado, o que significa que seu provedor de unidade precisa criar qualquer informação de estado necessária para o tempo de execução do Windows PowerShell quando ele chama seu provedor.
Para esse provedor de unidade, as informações de estado incluem a conexão com o banco de dados que é mantido como parte das informações da unidade. Aqui está o código que mostra como essas informações são armazenadas no objeto de 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 unidade
Para permitir que o tempo de execução do Windows PowerShell crie uma unidade, o provedor de unidade deve implementar o método System.Management.Automation.Provider.DriveCmdletProvider.NewDrive*. O código a seguir mostra a implementação do método System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* para esse provedor 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
Sua substituição desse método deve fazer o seguinte:
Verifique se o membro System.Management.Automation.PSDriveinfo.Root* existe e se uma conexão com o armazenamento de dados pode ser feita.
Crie uma unidade e preencha o membro da conexão, em suporte ao cmdlet
New-PSDrive
.Valide o objeto System.Management.Automation.PSDriveinfo para a unidade proposta.
Modifique o objeto de System.Management.Automation.PSDriveinfo que descreve a unidade com todas as informações de desempenho ou confiabilidade necessárias ou forneça dados extras para chamadores que usam a unidade.
Manipule falhas usando o método System.Management.Automation.Provider.CmdletProvider.WriteError e retorne
null
.Esse método retorna as informações da unidade que foram passadas para o método ou uma versão específica do provedor dele.
Anexando parâmetros dinâmicos ao NewDrive
O cmdlet New-PSDrive
suportado pelo provedor de unidade pode exigir parâmetros adicionais. Para anexar esses parâmetros dinâmicos ao cmdlet, o provedor implementa o método System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters*. Esse método retorna um objeto que tem propriedades e campos com atributos de análise semelhantes a uma classe de cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary.
Este fornecedor de unidade não substitui este método. No entanto, o código a seguir mostra a implementação padrão desse método:
Remover uma unidade
Para fechar a conexão do banco de dados, o provedor de unidade deve implementar o método System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive*. Esse método fecha a conexão com a unidade depois de limpar qualquer informação específica do provedor.
O código a seguir mostra a implementação do método de System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* para esse provedor 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 retornar as informações passadas para o método através do parâmetro drive
. Se a unidade não puder ser removida, o método deverá escrever uma exceção e, em seguida, retornar null
. Se o seu provedor não substituir esse método, a implementação padrão desse método apenas retorna as informações da unidade passadas como entrada.
Inicializando unidades padrão
Seu provedor de unidade implementa o método System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* para montar unidades. Por exemplo, o provedor do Ative Directory pode montar uma unidade para o contexto de nomenclatura padrão se o computador estiver associado a um domínio.
Esse método retorna uma coleção de informações de unidade sobre as unidades inicializadas ou uma coleção vazia. A chamada para esse método é feita depois que o tempo de execução do Windows PowerShell chama o System.Management.Automation.Provider.CmdletProvider.Start* método para inicializar o provedor.
Este provedor de unidade não substitui o método System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives*. No entanto, o código a seguir mostra a implementação padrão, que retorna uma coleção de unidade vazia:
Coisas para lembrar sobre a implementação de InitializeDefaultDrives
Todos os provedores de unidade devem montar uma unidade raiz para ajudar o usuário com a capacidade de descoberta. A unidade raiz pode listar locais que servem como raízes para outras unidades montadas. Por exemplo, o provedor do Ative Directory pode criar uma unidade que lista os contextos de nomenclatura encontrados nos atributos namingContext
no DSE (Ambiente de Sistema Distribuído) raiz. Isso ajuda os usuários a descobrir pontos de montagem para outras unidades.
Exemplo de código
Para obter o código de exemplo completo, consulte AccessDbProviderSample02 Code Sample.
Testando o provedor de unidade do Windows PowerShell
Quando seu provedor do Windows PowerShell tiver sido registrado no Windows PowerShell, você poderá testá-lo executando os cmdlets suportados na linha de comando, incluindo quaisquer cmdlets disponibilizados por derivação. Vamos testar o provedor de unidade de exemplo.
Execute o cmdlet
Get-PSProvider
para recuperar a lista de provedores para garantir que o provedor de unidade AccessDB esteja 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}
Verifique se existe um nome de servidor de banco de dados (DSN) para o banco de dados acessando a parte Fontes de Dados do Ferramentas Administrativas para o sistema operacional. Na tabela DSN do Usuário, clique duas vezes em de Banco de Dados do MS Access e adicione o caminho da unidade
C:\ps\northwind.mdb
.Crie uma nova unidade usando o provedor de unidade 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
Valide a ligação. Como a conexão é definida como um membro da unidade, você pode verificá-la usando o cmdlet Get-PDDrive.
Observação
O usuário ainda não pode interagir com o provedor como uma unidade, pois o provedor precisa da funcionalidade de contêiner para essa interação. Para obter mais informações, consulte Criando um provedor de contêiner do Windows PowerShell.
PS> (Get-PSDrive mydb). Conexã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 :
Remova a unidade e saia do shell:
PS> Remove-PSDrive mydb PS> exit
Ver também
Criando provedores do Windows PowerShell