Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird erläutert, wie Sie einen Windows PowerShell-Anbieter 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 umfassenderer Funktionalität finden Sie unter Anbieterbeispiele.
Schreiben eines einfachen Anbieters
Die grundlegendste Funktionalität eines Windows PowerShell-Anbieters besteht darin, Laufwerke zu erstellen und zu entfernen. In diesem Beispiel implementieren wir die System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* und System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* Methoden 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. Außerdem definieren Sie eine Methode zum Erstellen neuer Laufwerke, die diesen Anbieter verwenden.
Die beispiele in diesem Thema basieren auf dem AccessDBProviderSample02 Beispiel, das Teil eines größeren Beispiels ist, das eine Access-Datenbank als Windows PowerShell-Laufwerk darstellt.
Einrichten des Projekts
Erstellen Sie in Visual Studio ein Klassenbibliotheksprojekt mit dem Namen AccessDBProviderSample. Führen Sie die folgenden Schritte aus, um Ihr Projekt so zu konfigurieren, dass Windows PowerShell gestartet wird und der Anbieter in die Sitzung geladen wird, wenn Sie Ihr Projekt erstellen und starten.
Konfigurieren des Anbieterprojekts
Fügen Sie die System.Management.Automation-Assembly als Verweis auf Ihr Projekt hinzu.
Klicken Sie auf Project > AccessDBProviderSample-Eigenschaften > Debug-. Klicken Sie in Startprojekt-auf externe Programm starten, und navigieren Sie zur ausführbaren Windows PowerShell-Datei (in der Regel C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe).
Geben Sie unter StartoptionenFolgendes in das Feld Befehlszeilenargumente 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 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 System.Management.Automation.Provider.CmdletProviderAttribute versehen.
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 vom Windows PowerShell-Modul aufgerufen, wenn ein Benutzer die Microsoft.PowerShell.Commands.NewPSDriveCommand Cmdlet aufruft, das den Namen Ihres Anbieters angibt. Der PSDriveInfo-Parameter wird vom Windows PowerShell-Modul übergeben, und die Methode gibt das neue Laufwerk an das Windows PowerShell-Modul 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 laufwerksstamm, der übergeben wurde, vorhanden sind, und gibt null
zurück, wenn eine der Beiden 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;
}
Es folgt die interne AccessDBPSDriveInfo-Klasse, die den Konstruktor enthält, der zum Erstellen eines neuen Laufwerks verwendet wird, und enthält die Statusinformationen für das Laufwerk.
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 vom Windows PowerShell-Modul 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;
}