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.
Dieses Thema beschreibt, wie man einen Windows-PowerShell-Laufwerksanbieter erstellt, der eine Möglichkeit bietet, über ein Windows-PowerShell-Laufwerk auf einen Datenspeicher zuzugreifen. Diese Art von Anbieter wird auch als Windows PowerShell-Laufwerksanbieter bezeichnet. Die vom Anbieter verwendeten Windows-PowerShell-Laufwerke bieten die Möglichkeit, sich mit dem Datenspeicher zu verbinden.
Der hier beschriebene Windows-PowerShell-Laufwerksanbieter bietet Zugriff auf eine Microsoft Access-Datenbank. Für diesen Anbieter stellt das Windows-PowerShell-Laufwerk die Datenbank dar (es ist möglich, beliebig viele Laufwerke zu einem Laufwerksanbieter hinzuzufügen), die Top-Level-Container des Laufwerks repräsentieren die Tabellen in der Datenbank, und die Elemente der Container stellen die Zeilen in den Tabellen dar.
Definition der Windows PowerShell Provider-Klasse
Ihr Laufwerksanbieter muss eine .NET-Klasse definieren, die von der Basisklasse System.Management.Automation.Provider.DriveCmdletProvider abgeleitet ist. Hier ist die Klassendefinition für diesen Laufwerksanbieter:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
Beachten Sie, dass in diesem Beispiel das Attribut System.Management.Automation.Provider.CmdletProviderAttribute einen benutzerfreundlichen Namen für den Anbieter und die Windows-PowerShell-spezifischen Funktionen angibt, die der Anbieter während der Befehlsverarbeitung der Windows-PowerShell-Laufzeit bereitstellt. Die möglichen Werte für die Fähigkeiten des Anbieters werden durch die Aufzählung System.Management.Automation.Provider.ProviderCapabilities definiert. Dieser Laufwerksanbieter unterstützt keine dieser Funktionen.
Definition der Basisfunktionalität
Wie in Design Your Windows PowerShell Provider beschrieben, leitet sich die System.Management.Automation.Provider.DriveCmdletProvider-Klasse von der System.Management.Automation.Provider.CmdletProvider-Basisklasse ab, die die Methoden für die Initialisierung und Entinitialisierung des Providers definiert. Um Funktionen zum Hinzufügen sessionsspezifischer Initialisierungsinformationen und zur Freigabe von vom Anbieter verwendeten Ressourcen zu implementieren, siehe Erstellung eines einfachen Windows PowerShell-Anbieters. Die meisten Anbieter (einschließlich des hier beschriebenen Anbieters) können jedoch die Standardimplementierung dieser Funktionalität verwenden, die von Windows PowerShell bereitgestellt wird.
Erstellung von Laufwerkszustandsinformationen
Alle Windows-PowerShell-Anbieter gelten als stateless, was bedeutet, dass dein Laufwerksanbieter alle Zustandsinformationen erstellen muss, die die Windows-PowerShell-Laufzeit benötigt, wenn er deinen Anbieter aufruft.
Für diesen Laufwerksanbieter umfasst die Zustandsinformation die Verbindung zur Datenbank, die als Teil der Laufwerksdaten gespeichert wird. Hier ist Code, der zeigt, wie diese Informationen im Objekt System.Management.Automation.PSDriveinfo gespeichert werden, das das Laufwerk beschreibt:
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
Ein Laufwerk erstellen
Um der Windows-PowerShell-Laufzeit zu ermöglichen, ein Laufwerk zu erstellen, muss der Laufwerksanbieter die Methode System.Management.Automation.Provider.DriveDriveCmdletProvider.NewDrive* implementieren. Der folgende Code zeigt die Implementierung der System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* -Methode für diesen Laufwerksanbieter:
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
Ihre Übersteuerung dieser Methode sollte Folgendes tun:
Überprüfen Sie, ob das System.Management.Automation.PSDriveinfo.Root* -Mitglied existiert und dass eine Verbindung zum Datenspeicher hergestellt werden kann.
Erstellen Sie ein Laufwerk und füllen Sie das Verbindungsmitglied zur Unterstützung des
New-PSDriveCmdlets.Validiere das System.Management.Automation.PSDriveinfo-Objekt für das vorgeschlagene Laufwerk.
Das System.Management.Automation.PSDriveinfo-Objekt , das das Laufwerk beschreibt, mit allen erforderlichen Leistungs- oder Zuverlässigkeitsinformationen modifizieren oder zusätzliche Daten für Anrufer bereitstellen, die das Laufwerk nutzen.
Beheben Sie Fehler mit der Methode System.Management.Automation.Provider.CmdletProvider.WriteError und geben Sie dann . zurück.
nullDiese Methode gibt entweder die Laufwerksinformationen zurück, die an die Methode übermittelt wurden, oder eine anbieterspezifische Version davon.
Dynamische Parameter an NewDrive anhängen
Das New-PSDrive von deinem Laufwerksanbieter unterstützte CMDLET könnte zusätzliche Parameter benötigen. Um diese dynamischen Parameter dem Cmdlet zuzuordnen, implementiert der Anbieter die Methode System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters* . Diese Methode gibt ein Objekt zurück, das Eigenschaften und Felder mit Parsing-Attributen besitzt, ähnlich einer cmdlet-Klasse oder einem System.Management.Automation.RuntimeDefinedParameterDictionary-Objekt .
Dieser Laufwerksanbieter überschreibt diese Methode nicht. Der folgende Code zeigt jedoch die Standardimplementierung dieser Methode:
Entfernen eines Laufwerks
Um die Datenbankverbindung zu schließen, muss der Laufwerksanbieter die Methode System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* implementieren. Diese Methode schließt die Verbindung zum Laufwerk, nachdem alle anbieterspezifischen Informationen bearbeitet wurden.
Der folgende Code zeigt die Implementierung der System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* -Methode für diesen Laufwerksanbieter:
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
Wenn das Laufwerk entfernt werden kann, sollte die Methode die an die Methode übermittelte Informationen über den Parameter drive zurückgeben. Wenn das Laufwerk nicht entfernt werden kann, sollte die Methode eine Ausnahme schreiben und dann zurückgeben null. Wenn Ihr Anbieter diese Methode nicht überschreibt, gibt die Standardimplementierung einfach die als Eingabe übermittelten Laufwerksinformationen zurück.
Initialisierung von Standardlaufwerken
Ihr Laufwerksanbieter implementiert die System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives*- Methode, um Laufwerke zu mounten. Beispielsweise könnte der Active Directory-Anbieter ein Laufwerk für den Standard-Namenskontext montieren, wenn der Computer mit einer Domain verbunden ist.
Diese Methode liefert eine Sammlung von Laufwerksinformationen über die initialisierten Laufwerke oder eine leere Sammlung. Der Aufruf dieser Methode erfolgt, nachdem die Windows-PowerShell-Laufzeit die System.Management.Automation.Provider.CmdletProvider.Start* -Methode aufgerufen hat, um den Anbieter zu initialisieren.
Dieser Laufwerksanbieter überschreibt nicht die Methode System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* . Der folgende Code zeigt jedoch die Standardimplementierung, die eine leere Laufwerkssammlung zurückgibt:
Was Sie bei der Implementierung von InitializeDefaultDrives beachten sollten
Alle Laufwerksanbieter sollten ein Root-Laufwerk einbauen, um dem Nutzer die Auffindbarkeit zu erleichtern. Das Root-Laufwerk könnte Orte anlisten, die als Root für andere montierte Laufwerke dienen. Beispielsweise könnte der Active Directory-Anbieter ein Laufwerk erstellen, das die Namenskontexte in den namingContext Attributen der Root-Distributed System Environment (DSE) auflistet. Dies hilft Nutzern, Mount-Punkte für andere Laufwerke zu entdecken.
Codebeispiel
Für den vollständigen Beispielcode siehe AccessDbProviderSample02 Code Sample.
Testen des Windows PowerShell Laufwerksanbieters
Wenn Ihr Windows-PowerShell-Anbieter bei Windows PowerShell registriert ist, können Sie ihn testen, indem Sie die unterstützten Kommando-Kommandozeilen ausführen, einschließlich aller durch Derivation verfügbaren Cmdlets. Testen wir den Anbieter des Sample-Laufwerks.
Führen Sie das
Get-PSProviderCMDLET aus, um die Liste der Anbieter abzurufen und sicherzustellen, dass der AccessDB-Laufwerksanbieter vorhanden ist:PS>
Get-PSProviderDie folgende Ausgabe wird angezeigt:
Name Capabilities Drives ---- ------------ ------ AccessDB None {} Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess {C, Z} Function ShouldProcess {function} Registry ShouldProcess {HKLM, HKCU}Stellen Sie sicher, dass ein Datenbankservername (DSN) für die Datenbank existiert, indem Sie auf den Datenquellenbereich der Administrative Tools des Betriebssystems zugreifen. In der Benutzer-DSN-Tabelle doppelklicken Sie auf die MS Access Datenbank und fügen Sie den Laufwerkspfad
C:\ps\northwind.mdbhinzu.Erstelle ein neues Laufwerk mit dem Beispiel-Laufwerksanbieter:
New-PSDrive -Name mydb -Root C:\ps\northwind.mdb -PSProvider AccessDb`Die folgende Ausgabe wird angezeigt:
Name Provider Root CurrentLocation ---- -------- ---- --------------- mydb AccessDB C:\ps\northwind.mdbValidieren Sie die Verbindung. Da die Verbindung als Mitglied des Laufwerks definiert ist, kannst du sie mit dem Get-PDDrive-Cmdlet überprüfen.
Hinweis
Der Nutzer kann noch nicht mit dem Anbieter als Laufwerk interagieren, da der Anbieter für diese Interaktion eine Containerfunktionalität benötigt. Weitere Informationen finden Sie unter Erstellung eines Windows PowerShell Container Providers.
PS> (Get-PSDrive mydb). Verbindung
Die folgende Ausgabe wird angezeigt:
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 :Entferne das Laufwerk und verlasse die Hülle:
PS> Remove-PSDrive mydb PS> exit
Siehe auch
Erstellung von Windows-PowerShell-Anbietern