Delen via


Quickstart voor Windows PowerShell-provider

In dit onderwerp wordt uitgelegd hoe u een Windows PowerShell-provider maakt die basisfunctionaliteit heeft voor het maken van een nieuw station. Zie Overzicht van Windows PowerShell-providers voor algemene informatie over providers. Zie Voorbeelden van providersvoor voorbeelden van providers met meer volledige functionaliteit.

Een basisprovider schrijven

De meest eenvoudige functionaliteit van een Windows PowerShell-provider is het maken en verwijderen van stations. In dit voorbeeld implementeren we de System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* en System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* methoden van de klasse System.Management.Automation.Provider.DriveCmdlet Provider. U ziet ook hoe u een providerklasse declareert.

Wanneer u een provider schrijft, kunt u standaardstations opgeven die automatisch worden gemaakt wanneer de provider beschikbaar is. U definieert ook een methode voor het maken van nieuwe stations die gebruikmaken van die provider.

De voorbeelden in dit onderwerp zijn gebaseerd op de AccessDBProviderSample02 voorbeeld, dat deel uitmaakt van een groter voorbeeld dat een Access-database vertegenwoordigt als een Windows PowerShell-station.

Het project instellen

Maak in Visual Studio een klassebibliotheekproject met de naam AccessDBProviderSample. Voer de volgende stappen uit om uw project te configureren, zodat Windows PowerShell wordt gestart en de provider in de sessie wordt geladen wanneer u uw project bouwt en start.

Het providerproject configureren
  1. Voeg de Assembly System.Management.Automation toe als verwijzing naar uw project.

  2. Klik op Eigenschappen van Project > AccessDBProviderSample > Foutopsporing. Klik in Project startenop Extern programma startenen navigeer naar het uitvoerbare Windows PowerShell-bestand (meestal C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe).

  3. Voer onder Startoptieshet volgende in het vak opdrachtregelargumenten in: -NoExit -Command "[Reflection.Assembly]::LoadFrom(AccessDBProviderSample.dll' ) | Import-Module"

De providerklasse declareren

Onze provider is afgeleid van de klasse System.Management.Automation.Provider.DriveCmdletProvider. De meeste providers die echte functionaliteit bieden (het openen en bewerken van items, het navigeren in het gegevensarchief en het ophalen en instellen van inhoud van items) zijn afgeleid van de System.Management.Automation.Provider.NavigationCmdletProvider klasse.

Naast het opgeven dat de klasse is afgeleid van System.Management.Automation.Provider.DriveCmdletProvider, moet u deze voorzien van de System.Management.Automation.Provider.CmdletProviderAttribute-, zoals wordt weergegeven in het voorbeeld.

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
  {

}
}

NewDrive implementeren

De methode System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* wordt aangeroepen door de Windows PowerShell-engine wanneer een gebruiker de Microsoft.PowerShell.Commands.NewPSDriveCommand cmdlet aanroept die de naam van uw provider opgeeft. De parameter PSDriveInfo wordt doorgegeven door de Windows PowerShell-engine en de methode retourneert het nieuwe station naar de Windows PowerShell-engine. Deze methode moet worden gedeclareerd binnen de hierboven gemaakte klasse.

De methode controleert eerst of zowel het stationobject als de doorgegeven stationshoofdmap bestaan en retourneert null als een van beide niet. Vervolgens wordt een constructor van de interne klasse AccessDBPSDriveInfo gebruikt om een nieuw station te maken en een verbinding met de Access-database die het station vertegenwoordigt.

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;
    }

Hier volgt de interne klasse AccessDBPSDriveInfo die de constructor bevat die wordt gebruikt om een nieuw station te maken en bevat de statusinformatie voor het station.

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; }
    }
  }

RemoveDrive implementeren

De System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* methode wordt aangeroepen door de Windows PowerShell-engine wanneer een gebruiker de cmdlet Microsoft.PowerShell.Commands.RemovePSDriveCommand aanroept. De methode in deze provider sluit de verbinding met de Access-database.

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;
    }