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 explica como criar um provedor do Windows PowerShell que tenha a funcionalidade básica de criar uma nova unidade. Para obter informações gerais sobre provedores, consulte Visão geral do provedor do Windows PowerShell. Para obter exemplos de provedores com funcionalidade mais completa, consulte Exemplos de provedor.
Escrevendo um provedor básico
A funcionalidade mais básica de um provedor do Windows PowerShell é criar e remover unidades. Neste exemplo, implementamos o System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* e System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* métodos da classe System.Management.Automation.Provider.DriveCmdletProvider. Você também verá como declarar uma classe de provedor.
Ao escrever um provedor, você pode especificar unidades-unidades padrão que são criadas automaticamente quando o provedor está disponível. Você também define um método para criar novas unidades que usam esse provedor.
Os exemplos fornecidos neste tópico baseiam-se no exemplo de AccessDBProviderSample02, que faz parte de um exemplo maior que representa um banco de dados do Access como uma unidade do Windows PowerShell.
Criação do projeto
No Visual Studio, crie um projeto de biblioteca de classes chamado AccessDBProviderSample. Conclua as etapas a seguir para configurar seu projeto para que o Windows PowerShell seja iniciado e o provedor seja carregado na sessão, quando você compilar e iniciar seu projeto.
Configurar o projeto do provedor
Adicione o assembly System.Management.Automation como referência ao seu projeto.
Clique em Project > AccessDBProviderSample Properties > Debug. Em Iniciar projeto, clique em Iniciar programa externoe navegue até o executável do Windows PowerShell (normalmente C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe).
Em Opções Iniciar, insira o seguinte na caixa Argumentos de linha de comando:
-NoExit -Command "[Reflection.Assembly]::LoadFrom(AccessDBProviderSample.dll' ) | Import-Module"
Declarando a classe do provedor
Nosso provedor deriva da classe System.Management.Automation.Provider.DriveCmdletProvider. A maioria dos provedores que fornecem funcionalidade real (acessando e manipulando itens, navegando no armazenamento de dados e obtendo e definindo conteúdo de itens) derivam da classe System.Management.Automation.Provider.NavigationCmdletProvider.
Além de especificar que a classe deriva de System.Management.Automation.Provider.DriveCmdletProvider, você deve decorá-la com o System.Management.Automation.Provider.CmdletProviderAttribute como mostrado no exemplo.
namespace Microsoft.Samples.PowerShell.Providers
{
using System;
using System.Data;
using System.Data.Odbc;
using System.IO;
using System.Management.Automation;
using System.Management.Automation.Provider;
#region AccessDBProvider
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
{
}
}
Implementando o NewDrive
O método System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* é chamado pelo mecanismo do Windows PowerShell quando um usuário chama o cmdlet Microsoft.PowerShell.Commands.NewPSDriveCommand especificando o nome do seu provedor. O parâmetro PSDriveInfo é passado pelo mecanismo do Windows PowerShell e o método retorna a nova unidade para o mecanismo do Windows PowerShell. Este método deve ser declarado dentro da classe criada acima.
O método primeiro verifica se o objeto da unidade e a raiz da unidade que foram passadas existem, retornando null
se qualquer um deles não existir. Em seguida, ele usa um construtor da classe interna AccessDBPSDriveInfo para criar uma nova unidade e uma conexão com o banco de dados do Access que a unidade representa.
protected override PSDriveInfo NewDrive(PSDriveInfo drive)
{
// Check if the drive object is null.
if (drive == null)
{
WriteError(new ErrorRecord(
new ArgumentNullException("drive"),
"NullDrive",
ErrorCategory.InvalidArgument,
null));
return null;
}
// Check if the drive root is not null or empty
// and if it is 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;
}
A seguir está a classe interna AccessDBPSDriveInfo que inclui o construtor usado para criar uma nova unidade e contém as informações de estado para a unidade.
internal class AccessDBPSDriveInfo : PSDriveInfo
{
/// <summary>
/// A reference to the connection to the database.
/// </summary>
private OdbcConnection connection;
/// <summary>
/// Initializes a new instance of the AccessDBPSDriveInfo class.
/// The constructor takes a single argument.
/// </summary>
/// <param name="driveInfo">Drive defined by this provider</param>
public AccessDBPSDriveInfo(PSDriveInfo driveInfo)
: base(driveInfo)
{
}
/// <summary>
/// Gets or sets the ODBC connection information.
/// </summary>
public OdbcConnection Connection
{
get { return this.connection; }
set { this.connection = value; }
}
}
Implementando o RemoveDrive
O método System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* é chamado pelo mecanismo do Windows PowerShell quando um usuário chama o cmdlet Microsoft.PowerShell.Commands.RemovePSDriveCommand. O método neste provedor fecha a conexão com o banco de dados do Access.
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 the ODBC connection to the drive.
AccessDBPSDriveInfo accessDBPSDriveInfo = drive as AccessDBPSDriveInfo;
if (accessDBPSDriveInfo == null)
{
return null;
}
accessDBPSDriveInfo.Connection.Close();
return accessDBPSDriveInfo;
}