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:
Verifique se o membro system.Management.Automation.PSDriveinfo.Root* existe e que pode ser feita uma ligação à loja de dados.
Crie uma unidade e povoe o membro de ligação, em suporte ao
New-PSDrive
cmdlet.Validar o objeto System.Management.Automation.PSDriveinfo para a unidade proposta.
Modifique o objeto System.Management.Automation.PSDriveinfo que descreve a unidade com qualquer informação de desempenho ou fiabilidade necessária, ou forneça dados adicionais para os chamadores que utilizem a unidade.
Lidar com falhas utilizando o método System.Management.Automation.Provider.Cmdletprovider.WriteError e, em seguida, regressar
null
.Este método devolve a informação de unidade que foi passada ao método ou a uma versão específica do fornecedor do mesmo.
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.
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}
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
.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
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 :
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)
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários