Een Windows PowerShell-stationprovider maken
In dit onderwerp wordt beschreven hoe u een Windows PowerShell station provider die een manier biedt om toegang te krijgen tot een gegevensopslag via een Windows PowerShell station. Dit type provider wordt ook wel aangeduid als Windows PowerShell station providers. De Windows PowerShell stations die door de provider worden gebruikt, bieden de middelen om verbinding te maken met het gegevensopslag.
De Windows PowerShell die hier wordt beschreven, biedt toegang tot een Microsoft Access-database. Voor deze provider vertegenwoordigt het Windows PowerShell-station de database (het is mogelijk om een aantal stations toe te voegen aan een stationsprovider), vertegenwoordigen de containers op het hoogste niveau van het station de tabellen in de database en vertegenwoordigen de items van de containers de rijen in de tabellen.
De klasse Windows PowerShell provider definiëren
Uw stationprovider moet een .NET-klasse definiëren die is afgeleid van de basisklasse System.Management.Automation.Provider.Drivecmdletprovider. Dit is de klassedefinitie voor deze stationprovider:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
In dit voorbeeld geeft het kenmerk System.Management.Automation.Provider.Cmdletproviderattribute een gebruiksvriendelijke naam op voor de provider en de Windows PowerShell-specifieke mogelijkheden die de provider tijdens de verwerking van de opdracht aan de Windows PowerShell-runtime blootstelt. De mogelijke waarden voor de providermogelijkheden worden gedefinieerd door de system.Management.Automation.Provider.Providercaperation. Deze provider station biedt geen ondersteuning voor een van deze mogelijkheden.
Basisfunctionaliteit definiëren
Zoals beschreven in Uw Windows PowerShell-providerontwerpen, is de klasse System.Management.Automation.Provider.Drivecmdletprovider afgeleid van de basisklasse System.Management.Automation.Provider.Cmdletprovider die de methoden definieert die nodig zijn voor het initialiseren en uninitialiseren van de provider. Zie Creating a Basic Windows PowerShell Providervoor het implementeren van functionaliteit voor het toevoegen van sessiespecifieke initialisatiegegevens envoor het vrijgeven van resources die worden gebruikt door de provider. De meeste providers (inclusief de provider die hier wordt beschreven) kunnen echter gebruikmaken van de standaard implementatie van deze functionaliteit die wordt geleverd door Windows PowerShell.
Informatie over de status van het station maken
Alle Windows PowerShell-providers worden beschouwd als staatloos, wat betekent dat de provider van het station alle statusgegevens moet maken die nodig zijn voor de Windows PowerShell-runtime wanneer deze uw provider aanroept.
Voor deze stationprovider bevat statusinformatie de verbinding met de database die wordt bewaard als onderdeel van de schijfgegevens. Hier ziet u de code die laat zien hoe deze informatie wordt opgeslagen in het object System.Management.Automation.PSDriveinfo waarin het station wordt beschreven:
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
Een station maken
Als u de Windows PowerShell een station wilt maken, moet de stationprovider de methode System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* implementeren. De volgende code toont de implementatie van de methode System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* voor deze provider van het station:
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
Uw overschrijven van deze methode moet het volgende doen:
Controleer of het lid System.Management.Automation.PSDriveinfo.Root* bestaat en of er een verbinding met het gegevensopslag kan worden gemaakt.
Maak een station en vul het verbindingslid in ter ondersteuning van de
New-PSDrivecmdlet .Valideer het object System.Management.Automation.PSDriveinfo voor het voorgestelde station.
Wijzig het object System.Management.Automation.PSDriveinfo dat het station beschrijft met de vereiste prestatie- of betrouwbaarheidsinformatie, of geef extra gegevens op voor aanroepers die het station gebruiken.
Ver handelen fouten af met behulp van de methode System.Management.Automation.Provider.Cmdletprovider.WriteError en
nullretourneren.Deze methode retourneert de schijfgegevens die zijn doorgegeven aan de methode of een providerspecifieke versie ervan.
Dynamische parameters koppelen aan NewDrive
Voor New-PSDrive de cmdlet die wordt ondersteund door uw stationprovider zijn mogelijk extra parameters vereist. Als u deze dynamische parameters wilt koppelen aan de cmdlet, implementeert de provider de methode System.Management.Automation.Provider.Drivecmdletprovider.Newdrivedynamicparameters*. Met deze methode wordt een object met eigenschappen en velden met parseringskenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.Runtimedefinedparameterdictionary-object, retourneren.
Deze stationprovider overschrijven deze methode niet. De volgende code toont echter de standaard implementatie van deze methode:
Een station verwijderen
Als u de databaseverbinding wilt sluiten, moet de stationprovider de methode System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* implementeren. Met deze methode wordt de verbinding met het station gesloten nadat u providerspecifieke gegevens hebt opsschoond.
De volgende code toont de implementatie van de methode System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* voor deze stationprovider:
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
Als het station kan worden verwijderd, moet de methode de informatie retourneren die via de parameter aan de methode is drive doorgegeven. Als het station niet kan worden verwijderd, moet de methode een uitzondering schrijven en vervolgens null retourneren. Als uw provider deze methode niet overschrijven, retourneert de standaard implementatie van deze methode alleen de schijfgegevens die zijn doorgegeven als invoer.
Standaardstations initialiseren
Uw stationsprovider implementeert de methode System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives*. De Active Directory-provider kan bijvoorbeeld een station voor de standaardnaamgevingscontext aan een station toevoegen als de computer lid is van een domein.
Deze methode retourneert een verzameling stationsinformatie over de geinitialiseerde stations of een lege verzameling. De aanroep van deze methode wordt uitgevoerd nadat de Windows PowerShell runtime de methode System.Management.Automation.Provider.Cmdletprovider.Start* aanroept om de provider te initialiseren.
Deze stationprovider overschrijven niet de methode System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives*. De volgende code toont echter de standaard implementatie, die een lege schijfverzameling retourneert:
Dingen om te onthouden over het implementeren van InitializeDefaultDrives
Alle station providers moeten een hoofdstation om de gebruiker te helpen bij de detecteerbaarheid. Het hoofdstation kan locaties die fungeren als basis voor andere stations worden vermeld. De Active Directory-provider kan bijvoorbeeld een station maken waarin de naamgevingscontexten worden vermeld die zijn gevonden in de kenmerken van de namingContext DSE (Distributed System Environment) in de hoofdmap. Dit helpt gebruikers bij het vinden van de bevestigingspunten voor andere stations.
Codevoorbeeld
Zie AccessDbProviderSample02-codevoorbeeld voor de volledige voorbeeldcode.
De Windows PowerShell-stationprovider testen
Wanneer uw Windows PowerShell-provider is geregistreerd bij Windows PowerShell, kunt u deze testen door de ondersteunde cmdlets uit te voeren op de opdrachtregel, inclusief eventuele cmdlets die beschikbaar zijn gesteld door afleiding. We gaan de provider van het voorbeeldstation testen.
Voer de cmdlet uit om de lijst met providers op te halen om ervoor te
Get-PSProviderzorgen dat de AccessDB-stationprovider aanwezig is:PS->
Get-PSProviderDe volgende uitvoer wordt weergegeven:
Name Capabilities Drives ---- ------------ ------ AccessDB None {} Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess {C, Z} Function ShouldProcess {function} Registry ShouldProcess {HKLM, HKCU}Zorg ervoor dat er een databaseservernaam (DSN) bestaat voor de database door toegang te krijgen tot het gedeelte Gegevensbronnen van de systeembeheerprogramma's voor het besturingssysteem. Dubbelklik in de tabel User DSN op MS Access Database en voeg het stationpad
C:\ps\northwind.mdbtoe.Maak een nieuw station met behulp van de voorbeeldstationprovider:
new-psdrive -name mydb -root c:\ps\northwind.mdb -psprovider AccessDb`De volgende uitvoer wordt weergegeven:
Name Provider Root CurrentLocation ---- -------- ---- --------------- mydb AccessDB c:\ps\northwind.mdbValideer de verbinding. Omdat de verbinding is gedefinieerd als een lid van het station, kunt u deze controleren met behulp van de Get-PDDrive cmdlet.
Notitie
De gebruiker kan nog niet communiceren met de provider als een station, omdat de provider containerfunctionaliteit nodig heeft voor die interactie. Zie Creating a Windows PowerShell Container Provider (Een containerprovider Windows PowerShell maken) voor meer informatie.
PS> (get-psdrive mydb).connection
De volgende uitvoer wordt weergegeven:
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 :Verwijder het station en sluit de shell:
PS> remove-psdrive mydb PS> exit
Zie ook
Feedback
Feedback verzenden en weergeven voor