Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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:
Verifique se existe o membro System.Management.Automation.PSDriveinfo.Root * e que é possível estabelecer uma ligação ao armazenamento de dados.
Crie um disco e preenche o membro da ligação, em apoio ao
New-PSDrivecmdlet.Valide o objeto System.Management.Automation.PSDriveinfo para a unidade proposta.
Modificar o objeto System.Management.Automation.PSDriveinfo que descreve o disco com qualquer informação de desempenho ou fiabilidade necessária, ou fornecer dados extra para os chamadores que utilizam o disco.
Trate das falhas usando o método System.Management.Automation.Provider.CmdletProvider.WriteError e depois retorne
null.Este método devolve ou a informação do disco que foi passada ao método ou uma versão específica do fornecedor.
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.
Execute o
Get-PSProvidercmdlet para recuperar a lista de fornecedores e garantir que o fornecedor do disco AccessDB está presente:PS>
Get-PSProviderA 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}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 .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.mdbValida 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 :Remova o disco e saia da carcaça:
PS> Remove-PSDrive mydb PS> exit
Ver também
Criação de Fornecedores Windows PowerShell