Windows PowerShell-Anbieter: Schnellstart

In diesem Thema wird erläutert, wie Sie einen Windows PowerShell erstellen, der über grundlegende Funktionen zum Erstellen eines neuen Laufwerks verfügt. Allgemeine Informationen zu Anbietern finden Sie unter Windows PowerShell Provider Overview. Beispiele für Anbieter mit vollständigeren Funktionen finden Sie unter Anbieterbeispiele.

Schreiben eines Basisanbieters

Die grundlegendste Funktionalität eines Windows PowerShell ist das Erstellen und Entfernen von Laufwerken. In diesem Beispiel implementieren wir die Methoden System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* und System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* der System.Management.Automation.Provider.Drivecmdletprovider-Klasse. Außerdem erfahren Sie, wie Sie eine Anbieterklasse deklarieren.

Wenn Sie einen Anbieter schreiben, können Sie Standardlaufwerke angeben, die automatisch erstellt werden, wenn der Anbieter verfügbar ist. Sie definieren auch eine Methode zum Erstellen neuer Laufwerke, die diesen Anbieter verwenden.

Die in diesem Thema bereitgestellten Beispiele basieren auf dem AccessDBProviderSample02-Beispiel, das Teil eines größeren Beispiels ist, das eine Access-Datenbank als Windows PowerShell darstellt.

Einrichten des Projekts

Erstellen Visual Studio ein Klassenbibliotheksprojekt mit dem Namen AccessDBProviderSample. Führen Sie die folgenden Schritte aus, um das Projekt so zu konfigurieren, dass Windows PowerShell wird und der Anbieter in die Sitzung geladen wird, wenn Sie das Projekt erstellen und starten.

Konfigurieren des Anbieterprojekts
  1. Fügen Sie die Assembly System.Management.Automation als Verweis auf Ihr Projekt hinzu.

  2. Klicken Project > auf AccessDBProviderSample-Eigenschaften, > Debuggen. Klicken Sie unter Projekt starten auf Externes Programm starten, und navigieren Sie zur ausführbaren Windows PowerShell-Datei (in der Regel c:\Windows\System32\WindowsPowerShell\v1.0 \ .powershell.exe).

  3. Geben Sie unter Startoptionen im Feld Befehlszeilenargumente Folgendes ein: -noexit -command "[reflection.assembly]::loadFrom(AccessDBProviderSample.dll' ) | import-module"

Deklarieren der Anbieterklasse

Unser Anbieter wird von der System.Management.Automation.Provider.Drivecmdletprovider-Klasse abgeleitet. Die meisten Anbieter, die echte Funktionen bereitstellen (Zugreifen auf und Bearbeiten von Elementen, Navigieren im Datenspeicher und Abrufen und Festlegen des Inhalts von Elementen), werden von der System.Management.Automation.Provider.Navigationcmdletprovider-Klasse abgeleitet.

Zusätzlich zur Angabe, dass die Klasse von System.Management.Automation.Provider.Drivecmdletproviderabgeleitet wird, müssen Sie sie wie im Beispiel gezeigt mit dem Attribut System.Management.Automation.Provider.Cmdletproviderattribute bezieren.

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
  {

}
}

Implementieren von NewDrive

Die System.Management.Automation.Provider.Drivecmdletprovider.Newdrive*-Methode wird von der Windows PowerShell-Engine aufgerufen, wenn ein Benutzer das Cmdlet Microsoft.PowerShell.Commands.NewPSDriveCommand unter Angabe des Namens Ihres Anbieters aufruft. Der PSDriveInfo-Parameter wird von der Windows PowerShell-Engine übergeben, und die -Methode gibt das neue Laufwerk an die Windows PowerShell zurück. Diese Methode muss innerhalb der oben erstellten Klasse deklariert werden.

Die -Methode überprüft zunächst, ob sowohl das Laufwerkobjekt als auch der übergebene Laufwerksstamm vorhanden sind, und gibt zurück, wenn eines der Laufwerke null nicht vorhanden ist. Anschließend wird ein Konstruktor der internen Klasse AccessDBPSDriveInfo verwendet, um ein neues Laufwerk und eine Verbindung mit der Access-Datenbank zu erstellen, die das Laufwerk darstellt.

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

Im Folgenden finden Sie die interne AccessDBPSDriveInfo-Klasse, die den Konstruktor enthält, der zum Erstellen eines neuen Laufwerks verwendet wird, und die Zustandsinformationen für das Laufwerk enthält.

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

Implementieren von RemoveDrive

Die System.Management.Automation.Provider.Drivecmdletprovider.Removedrive*-Methode wird von der Windows PowerShell-Engine aufgerufen, wenn ein Benutzer das Cmdlet Microsoft.PowerShell.Commands.RemovePSDriveCommand aufruft. Die -Methode in diesem Anbieter schließt die Verbindung mit der Access-Datenbank.

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