Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico descreve como criar um provedor Windows PowerShell que possa manipular os dados em um armazenamento de dados. Neste tópico, os elementos de dados na loja são chamados de "itens" do armazenamento de dados. Como consequência, um provedor que pode manipular os dados na loja é chamado de provedor de itens do Windows PowerShell.
Observação
Você pode baixar o arquivo-fonte em C# (AccessDBSampleProvider03.cs) deste provedor usando o Microsoft Windows Software Development Kit para Windows Vista e os Componentes de Runtime do .NET Framework 3.0. Para instruções de download, veja Como Instalar o Windows PowerShell e Baixar o Windows PowerShell SDK.
Os arquivos fonte baixados estão disponíveis no PowerShell Samples diretório. Para mais informações sobre outras implementações de provedores Windows PowerShell, veja Designing Your Windows PowerShell Provider.
O provedor de itens do Windows PowerShell descrito neste tópico obtém itens de dados de um banco de dados Access. Nesse caso, um "item" é ou uma tabela no banco de dados Access ou uma linha em uma tabela.
Definindo a classe provedor de itens do Windows PowerShell
Um provedor de itens do Windows PowerShell deve definir uma classe .NET que derive da classe base System.Management.Automation.Provider.ItemCmdletProvider . A seguir está a definição de classe para o provedor de itens descrito nesta seção.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ItemCmdletProvider
Note que, nesta definição de classe, o atributo System.Management.Automation.Provider.CmdletProviderAttribute inclui dois parâmetros. O primeiro parâmetro especifica um nome amigável para o provedor usado pelo Windows PowerShell. O segundo parâmetro especifica as capacidades específicas do Windows PowerShell que o provedor expõe ao tempo de execução do Windows PowerShell durante o processamento de comandos. Para este provedor, não há recursos adicionais específicos do PowerShell do Windows.
Definindo a funcionalidade base
Como descrito em Design Your Windows PowerShell Provider, a classe System.Management.Automation.Provider.DriveCmdletProvider deriva de várias outras classes que forneciam funcionalidades diferentes de provedores. Portanto, um provedor de itens do Windows PowerShell deve definir toda a funcionalidade fornecida por essas classes.
Para mais informações sobre como implementar funcionalidades para adicionar informações específicas de inicialização de sessão e para liberar recursos usados pelo provedor, veja Criando um Provedor Básico de PowerShell para Windows. No entanto, a maioria dos provedores, incluindo o fornecido aqui, pode usar a implementação padrão dessa funcionalidade fornecida pelo Windows PowerShell.
Antes que o provedor de itens do Windows PowerShell possa manipular os itens na loja, ele deve implementar os métodos da classe base System.Management.Automation.Provider.DriveCmdletProvider para acessar o armazenamento de dados. Para mais informações sobre como implementar essa classe, veja Criando um Provedor de Unidades Windows PowerShell.
Verificação da validade do caminho
Ao buscar um dado, o runtime do Windows PowerShell fornece um caminho do Windows PowerShell para o provedor, conforme definido na seção "Conceitos PSPath" de Como o Windows PowerShell Funciona. Um provedor de itens do Windows PowerShell deve verificar a validade sintática e semântica de qualquer caminho passado a ele implementando o método System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath . Esse método retorna true se o caminho for válido, e false caso contrário. Esteja ciente de que a implementação desse método não deve verificar a existência do item no caminho, mas apenas que o caminho está sintaticamente e semanticamente correto.
Aqui está a implementação do método System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath para este provedor. Note que essa implementação chama um método auxiliar NormalizePath para converter todos os separadores no caminho em um uniforme.
protected override bool IsValidPath(string path)
{
bool result = true;
// check if the path is null or empty
if (String.IsNullOrEmpty(path))
{
result = false;
}
// convert all separators in the path to a uniform one
path = NormalizePath(path);
// split the path into individual chunks
string[] pathChunks = path.Split(pathSeparator.ToCharArray());
foreach (string pathChunk in pathChunks)
{
if (pathChunk.Length == 0)
{
result = false;
}
}
return result;
} // IsValidPath
Determinar se um item existe
Após verificar o caminho, o tempo de execução do Windows PowerShell deve determinar se existe um dado nesse caminho. Para suportar esse tipo de consulta, o provedor de itens do Windows PowerShell implementa o método System.Management.Automation.Provider.ItemCmdletProvider.ItemExists . Esse método retorna true um item encontrado no caminho especificado e false (padrão) caso contrário.
Aqui está a implementação do método System.Management.Automation.Provider.ItemCmdletProvider.ItemExists para esse provedor. Note que esse método chama os métodos auxiliares PathIsDrive, ChunkPath e GetTable , e utiliza um objeto DatabaseTableInfo definido pelo provedor.
protected override bool ItemExists(string path)
{
// check if the path represented is a drive
if (PathIsDrive(path))
{
return true;
}
// Obtain type, table name and row number from path
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
DatabaseTableInfo table = GetTable(tableName);
if (type == PathType.Table)
{
// if specified path represents a table then DatabaseTableInfo
// object for the same should exist
if (table != null)
{
return true;
}
}
else if (type == PathType.Row)
{
// if specified path represents a row then DatabaseTableInfo should
// exist for the table and then specified row number must be within
// the maximum row count in the table
if (table != null && rowNumber < table.RowCount)
{
return true;
}
}
return false;
} // ItemExists
Coisas para lembrar sobre implementar o ItemExists
As seguintes condições podem se aplicar à sua implementação de System.Management.Automation.Provider.ItemCmdletProvider.ItemExists:
- Ao definir a classe provedor, um provedor de itens do Windows PowerShell pode declarar capacidades de provedor de
ExpandWildcards,Filter,Include, ouExclude, a partir da enumeração System.Management.Automation.Provider.ProviderCapabilities . Nesses casos, a implementação do método System.Management.Automation.Provider.ItemCmdletProvider.ItemExists deve garantir que o caminho passado para o método atenda aos requisitos das capacidades especificadas. Para isso, o método deve acessar a propriedade apropriada, por exemplo, as propriedades System.Management.Automation.Provider.CmdletProvider.Exclude e System.Management.Automation.Provider.CmdletProvider.Include properties. - A implementação desse método deve lidar com qualquer forma de acesso ao item que possa torná-lo visível para o usuário. Por exemplo, se um usuário tem acesso de escrita a um arquivo através do provedor de Sistema de Arquivos (fornecido pelo Windows PowerShell), mas não acesso de leitura, o arquivo ainda existe e System.Management.Automation.Provider.ItemCmdletProvider.ItemExists retorna
true. Sua implementação pode exigir verificar um item pai para ver se ele pode ser enumerado.
Anexando parâmetros dinâmicos ao cmdlet de Test-Path
Às vezes, o Test-Path cmdlet que chama System.Management.Automation.Provider.ItemCmdletProvider.ItemExists requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer esses parâmetros dinâmicos, o provedor de itens do Windows PowerShell deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters . Esse método recupera os parâmetros dinâmicos do item no caminho indicado e retorna um objeto que possui propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary . O runtime do Windows PowerShell usa o objeto retornado para adicionar os parâmetros ao Test-Path cmdlet.
Este provedor de itens do Windows PowerShell não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.
Recuperando um item
Para recuperar um item, o provedor de itens do Windows PowerShell deve sobrescrever o método System.Management.Automation.Provider.ItemCmdletProvider.GetItem para suportar chamadas do Get-Item cmdlet. Este método escreve o item usando o método System.Management.Automation.Provider.CmdletProvider.WriteItemObject .
Aqui está a implementação do método System.Management.Automation.Provider.ItemCmdletProvider.GetItem para esse provedor. Note que esse método usa os métodos auxiliares GetTable e GetRow para recuperar itens que são tabelas no banco de dados Access ou linhas em uma tabela de dados.
protected override void GetItem(string path)
{
// check if the path represented is a drive
if (PathIsDrive(path))
{
WriteItemObject(this.PSDriveInfo, path, true);
return;
}// if (PathIsDrive...
// Get table name and row information from the path and do
// necessary actions
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
DatabaseTableInfo table = GetTable(tableName);
WriteItemObject(table, path, true);
}
else if (type == PathType.Row)
{
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row, path, false);
}
else
{
ThrowTerminatingInvalidPathException(path);
}
} // GetItem
Coisas para lembrar sobre implementar o GetItem
As seguintes condições podem se aplicar a uma implementação de System.Management.Automation.Provider.ItemCmdletProvider.GetItem:
Ao definir a classe provedor, um provedor de itens do Windows PowerShell pode declarar capacidades de provedor de
ExpandWildcards,Filter,Include, ouExclude, a partir da enumeração System.Management.Automation.Provider.ProviderCapabilities . Nesses casos, a implementação do System.Management.Automation.Provider.ItemCmdletProvider.GetItem deve garantir que o caminho passado para o método atenda a esses requisitos. Para isso, o método deve acessar a propriedade apropriada, por exemplo, as propriedades System.Management.Automation.Provider.CmdletProvider.Exclude e System.Management.Automation.Provider.CmdletProvider.Include properties.Por padrão, as sobrescrituras desse método não devem recuperar objetos que geralmente estão ocultos do usuário, a menos que a propriedade System.Management.Automation.Provider.CmdletProvider.Force esteja definida como
true. Por exemplo, o método System.Management.Automation.Provider.ItemCmdletProvider.GetItem para o provedor do Sistema de Arquivos verifica a propriedade System.Management.Automation.Provider.CmdletProvider.Force antes de tentar chamar System.Management.Automation.Provider.CmdletProvider.WriteItemObject para arquivos ocultos ou do sistema.
Anexando parâmetros dinâmicos ao cmdlet de Get-Item
Às vezes, o Get-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer esses parâmetros dinâmicos, o fornecedor de itens do Windows PowerShell deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters . Esse método recupera os parâmetros dinâmicos do item no caminho indicado e retorna um objeto que possui propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary . O runtime do Windows PowerShell usa o objeto retornado para adicionar os parâmetros ao Get-Item cmdlet.
Este provedor não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.
Configuração de um item
Para definir um item, o provedor de itens do Windows PowerShell deve sobrescrever o método System.Management.Automation.Provider.ItemCmdletProvider.SetItem para suportar chamadas do Set-Item cmdlet. Esse método define o valor do item no caminho especificado.
Este provedor não fornece uma substituição para o método System.Management.Automation.Provider.ItemCmdletProvider.SetItem . No entanto, a seguir está a implementação padrão desse método.
Coisas para lembrar sobre implementar o SetItem
As seguintes condições podem se aplicar à sua implementação de System.Management.Automation.Provider.ItemCmdletProvider.SetItem:
Ao definir a classe provedor, um provedor de itens do Windows PowerShell pode declarar capacidades de provedor de
ExpandWildcards,Filter,Include, ouExclude, a partir da enumeração System.Management.Automation.Provider.ProviderCapabilities . Nesses casos, a implementação do System.Management.Automation.Provider.ItemCmdletProvider.SetItem deve garantir que o caminho passado para o método atenda a esses requisitos. Para isso, o método deve acessar a propriedade apropriada, por exemplo, as propriedades System.Management.Automation.Provider.CmdletProvider.Exclude e System.Management.Automation.Provider.CmdletProvider.Include properties.Por padrão, as sobrescrituras desse método não devem definir ou escrever objetos ocultos do usuário, a menos que a propriedade System.Management.Automation.Provider.CmdletProvider.Force esteja definida como
true. Um erro deve ser enviado para o método System.Management.Automation.Provider.CmdletProvider.WriteError se o caminho representar um item oculto e System.Management.Automation.Provider.CmdletProvider.Force estiver definido comofalse.Sua implementação do método System.Management.Automation.Provider.ItemCmdletProvider.SetItem deve chamar System.Management.Automation.Provider.CmdletProvider.ShouldProcess e verificar seu valor de retorno antes de fazer qualquer alteração no armazenamento de dados. Esse método é usado para confirmar a execução de uma operação quando uma alteração é feita no armazenamento de dados, por exemplo, a exclusão de arquivos. O método System.Management.Automation.Provider.CmdletProvider.ShouldProcess envia o nome do recurso a ser alterado para o usuário, com o runtime do Windows PowerShell levando em conta quaisquer configurações de linha de comando ou variáveis de preferência para determinar o que deve ser exibido.
Após a chamada para System.Management.Automation.Provider.CmdletProvider.ShouldProcess retorna
true, o método System.Management.Automation.Provider.ItemCmdletProvider.SetItem deve chamar o método System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Esse método envia uma mensagem ao usuário para permitir feedback e verificar se a operação deve ser continuada. A chamada para System.Management.Automation.Provider.CmdletProvider.ShouldContinue permite uma verificação adicional para modificações potencialmente perigosas do sistema.
Recuperando parâmetros dinâmicos para o SetItem
Às vezes, o Set-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer esses parâmetros dinâmicos, o provedor de itens do Windows PowerShell deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters . Esse método recupera os parâmetros dinâmicos do item no caminho indicado e retorna um objeto que possui propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary . O runtime do Windows PowerShell usa o objeto retornado para adicionar os parâmetros ao Set-Item cmdlet.
Este provedor não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.
Liberando um item
Para limpar um item, o provedor de itens do Windows PowerShell implementa o método System.Management.Automation.Provider.ItemCmdletProvider.ClearItem para suportar chamadas do Clear-Item cmdlet. Esse método apaga o item de dados no caminho especificado.
Este provedor não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.
Coisas para lembrar sobre implementar o ClearItem
As seguintes condições podem se aplicar a uma implementação de System.Management.Automation.Provider.ItemCmdletProvider.ClearItem:
Ao definir a classe provedor, um provedor de itens do Windows PowerShell pode declarar capacidades de provedor de
ExpandWildcards,Filter,Include, ouExclude, a partir da enumeração System.Management.Automation.Provider.ProviderCapabilities . Nesses casos, a implementação do System.Management.Automation.Provider.ItemCmdletProvider.ClearItem deve garantir que o caminho passado para o método atenda a esses requisitos. Para isso, o método deve acessar a propriedade apropriada, por exemplo, as propriedades System.Management.Automation.Provider.CmdletProvider.Exclude e System.Management.Automation.Provider.CmdletProvider.Include properties.Por padrão, as sobrescrituras desse método não devem definir ou escrever objetos ocultos do usuário, a menos que a propriedade System.Management.Automation.Provider.CmdletProvider.Force esteja definida como
true. Um erro deve ser enviado ao método System.Management.Automation.Provider.CmdletProvider.WriteError se o caminho representar um item oculto do usuário e System.Management.Automation.Provider.CmdletProvider.Force for definido parafalse.Sua implementação do método System.Management.Automation.Provider.ItemCmdletProvider.SetItem deve chamar System.Management.Automation.Provider.CmdletProvider.ShouldProcess e verificar seu valor de retorno antes de fazer qualquer alteração no armazenamento de dados. Esse método é usado para confirmar a execução de uma operação quando uma alteração é feita no armazenamento de dados, por exemplo, a exclusão de arquivos. O método System.Management.Automation.Provider.CmdletProvider.ShouldProcess envia o nome do recurso a ser alterado para o usuário, com o runtime do Windows PowerShell, e gerencia quaisquer configurações de linha de comando ou variáveis de preferência para determinar o que deve ser exibido.
Após a chamada para System.Management.Automation.Provider.CmdletProvider.ShouldProcess retorna
true, o método System.Management.Automation.Provider.ItemCmdletProvider.SetItem deve chamar o método System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Esse método envia uma mensagem ao usuário para permitir feedback e verificar se a operação deve ser continuada. A chamada para System.Management.Automation.Provider.CmdletProvider.ShouldContinue permite uma verificação adicional para modificações potencialmente perigosas do sistema.
Recuperar parâmetros dinâmicos para o ClearItem
Às vezes, o Clear-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer esses parâmetros dinâmicos, o fornecedor de itens do Windows PowerShell deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters . Esse método recupera os parâmetros dinâmicos do item no caminho indicado e retorna um objeto que possui propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary . O runtime do Windows PowerShell usa o objeto retornado para adicionar os parâmetros ao Clear-Item cmdlet.
Este fornecedor de itens não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.
Realizando uma ação padrão para um item
Um provedor de itens do Windows PowerShell pode implementar o método System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction para suportar chamadas do Invoke-Item cmdlet, o que permite ao provedor executar uma ação padrão para o item no caminho especificado. Por exemplo, o provedor do Sistema de Arquivos pode usar esse método para chamar o ShellExecute para um item específico.
Este provedor não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.
Coisas para lembrar sobre implementar o InvokeDefaultAction
As seguintes condições podem se aplicar a uma implementação de System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:
Ao definir a classe provedor, um provedor de itens do Windows PowerShell pode declarar capacidades de provedor de
ExpandWildcards,Filter,Include, ouExclude, a partir da enumeração System.Management.Automation.Provider.ProviderCapabilities . Nesses casos, a implementação do System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction deve garantir que o caminho passado para o método atenda a esses requisitos. Para isso, o método deve acessar a propriedade apropriada, por exemplo, as propriedades System.Management.Automation.Provider.CmdletProvider.Exclude e System.Management.Automation.Provider.CmdletProvider.Include properties.Por padrão, as sobrescrituras desse método não devem definir ou escrever objetos ocultos do usuário, a menos que a propriedade System.Management.Automation.Provider.CmdletProvider.Force esteja definida como
true. Um erro deve ser enviado ao método System.Management.Automation.Provider.CmdletProvider.WriteError se o caminho representar um item oculto do usuário e System.Management.Automation.Provider.CmdletProvider.Force for definido parafalse.
Recuperar parâmetros dinâmicos para InvokeDefaultAction
Às vezes, o Invoke-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer esses parâmetros dinâmicos, o fornecedor de itens do Windows PowerShell deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters . Esse método recupera os parâmetros dinâmicos do item no caminho indicado e retorna um objeto que possui propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary . O runtime do Windows PowerShell usa o objeto retornado para adicionar os parâmetros dinâmicos ao Invoke-Item cmdlet.
Este fornecedor de itens não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.
Implementação de métodos e classes auxiliares
Esse provedor de itens implementa vários métodos e classes auxiliares que são usados pelos métodos públicos de override definidos pelo Windows PowerShell. O código desses métodos e classes auxiliares é mostrado na seção de Exemplo de Código .
Método NormalizePath
Esse provedor de itens implementa um método auxiliar NormalizePath para garantir que o caminho tenha um formato consistente. O formato especificado usa uma barra adicional (\) como separador.
Método PathIsDrive
Esse provedor de itens implementa um método auxiliar PathIsDrive para determinar se o caminho especificado é realmente o nome da unidade.
Método ChunkPath
Esse provedor de itens implementa um método auxiliar ChunkPath que separa o caminho especificado para que o provedor possa identificar seus elementos individuais. Ele retorna um array composto pelos elementos do caminho.
Método GetTable
Esse provedor de itens implementa o método helper GetTables que retorna um objeto DatabaseTableInfo que representa informações sobre a tabela especificada na chamada.
Método GetRow
O método System.Management.Automation.Provider.ItemCmdletProvider.GetItem deste provedor de itens chama o método helper GetRows . Esse método auxiliar recupera um objeto DatabaseRowInfo que representa informações sobre a linha especificada na tabela.
Classe DatabaseTableInfo
Este provedor de itens define uma classe DatabaseTableInfo que representa uma coleção de informações em uma tabela de dados no banco de dados. Esta classe é semelhante à classe System.IO.Directoryinfo .
O provedor de itens de exemplo define um método DatabaseTableInfo.GetTables que retorna uma coleção de objetos de informação de tabela que definem as tabelas do banco de dados. Esse método inclui um bloco try/catch para garantir que qualquer erro de banco de dados apareça como uma linha com zero entradas.
Classe DatabaseRowInfo
Esse provedor de itens define a classe auxiliar DatabaseRowInfo que representa uma linha em uma tabela do banco de dados. Esta classe é semelhante à classe System.IO.FileInfo .
O provedor de amostra define um método DatabaseRowInfo.GetRows para retornar uma coleção de objetos de informação de linha para a tabela especificada. Esse método inclui um bloqueio try/catch para capturar exceções. Qualquer erro resultará em nenhuma informação de linha.
Exemplo de código
Para um código de exemplo completo, veja AccessDbProviderSample03 Code Sample.
Definição de tipos de objetos e formatação
Ao escrever um provedor, pode ser necessário adicionar membros a objetos existentes ou definir novos objetos. Quando terminar, crie um arquivo Types que o PowerShell do Windows possa usar para identificar os membros do objeto e um arquivo Format que defina como o objeto é exibido. Para mais informações, veja Estendendo Tipos de Objeto e Formatação.
Construindo o provedor Windows PowerShell
Veja como registrar cmdlets, provedores e aplicações host.
Testando o provedor PowerShell do Windows
Quando esse provedor de itens do Windows PowerShell está registrado no Windows PowerShell, você só pode testar a funcionalidade básica e do disco do provedor. Para testar a manipulação dos itens, você também deve implementar funcionalidades de contêineres descritas em Implementando um Provedor de PowerShell para Windows para Container.
Consulte também
- Windows PowerShell SDK
- Guia do Programador do Windows PowerShell
- Criando Provedores PowerShell para Windows
- Projetando seu fornecedor de PowerShell para Windows
- Estendendo os Tipos de Objetos e Formatação
- Como Funciona o PowerShell do Windows
- Criando um provedor de PowerShell para Windows para contêineres
- Criando um provedor PowerShell para Windows Drive
- Como Registrar Comandantes, Provedores e Aplicações Host