Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Dit onderwerp beschrijft hoe je een Windows PowerShell-schijfprovider kunt maken die een manier biedt om toegang te krijgen tot een datawinkel via een Windows PowerShell-schijf. Dit type provider wordt ook wel Windows PowerShell-driveproviders genoemd. De Windows PowerShell-schijven die door de provider worden gebruikt, bieden de mogelijkheid om verbinding te maken met de datastore.
De hier beschreven Windows PowerShell-schijfprovider biedt toegang tot een Microsoft Access-database. Voor deze provider vertegenwoordigt de Windows PowerShell-schijf de database (het is mogelijk om een willekeurig aantal schijven aan een schijfprovider toe te voegen), de top-level containers van de schijf vertegenwoordigen de tabellen in de database, en de items van de containers vertegenwoordigen de rijen in de tabellen.
Het definiëren van de Windows PowerShell Provider Class
Je drive provider moet een .NET-klasse definiëren die is afgeleid van de System.Management.Automation.Provider.DriveCmdletProvider-basisklasse . Hier is de klasse-definitie voor deze schijfprovider:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
Let op dat in dit voorbeeld het attribuut System.Management.Automation.Provider.CmdletProviderAttribute een gebruiksvriendelijke naam specificeert voor de provider en de Windows PowerShell-specifieke mogelijkheden die de provider tijdens de commandoverwerking aan de Windows PowerShell-runtime blootstelt. De mogelijke waarden voor de providercapaciteiten worden gedefinieerd door de System.Management.Automation.Provider.ProviderCapabilitiess-enumeratie . Deze schijfleverancier ondersteunt geen van deze mogelijkheden.
Basisfunctionaliteit definiëren
Zoals beschreven in Design Your Windows PowerShell Provider, is de System.Management.Automation.Provider.DriveDriveCmdletProvider-klasse afgeleid van de System.Management.Automation.Provider.CmdletProvider-basisklasse die de methoden definieert die nodig zijn voor het initialiseren en terughalen van de provider. Om functionaliteit te implementeren voor het toevoegen van sessie-specifieke initialisatie-informatie en het vrijgeven van resources die door de provider worden gebruikt, zie Creating a Basic Windows PowerShell Provider. De meeste providers (inclusief de hier beschreven provider) kunnen echter de standaardimplementatie van deze functionaliteit gebruiken die door Windows PowerShell wordt geleverd.
Aanmaken van schijfstatusinformatie
Alle Windows PowerShell-providers worden als stateless beschouwd, wat betekent dat je schijfprovider alle statusinformatie moet aanmaken die nodig is voor de Windows PowerShell-runtime wanneer deze je provider oproept.
Voor deze schijvleverancier omvat de statusinformatie de verbinding met de database die als onderdeel van de schijfinformatie wordt bewaard. Hier is code die laat zien hoe deze informatie wordt opgeslagen in het objectobject System.Management.Automation.PSDriveinfo dat de schijf beschrijft:
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 schijf aanmaken
Om de Windows PowerShell-runtime toe te staan een schijf te maken, moet de schijfprovider de System.Management.Automation.Provider.DriveDriveCmdletProvider.NewDrive* -methode implementeren. De volgende code toont de implementatie van de System.Management.Automation.Provider.DriveDriveCmdletProvider.NewDrive* methode voor deze schijfprovider:
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
Je overruling van deze methode zou het volgende moeten doen:
Controleer of het System.Management.Automation.PSDriveinfo.Root* -lid bestaat en dat er een verbinding met de dataopslag kan worden gemaakt.
Maak een schijf aan en vul het verbindingslid, ter ondersteuning van de
New-PSDrivecmdlet.Valideer het objectje System.Management.Automation.PSDriveinfo voor de voorgestelde schijf.
Wijzig het System.Management.Automation.PSDriveinfo-object dat de schijf beschrijft met benodigde prestatie- of betrouwbaarheidsinformatie, of bied extra gegevens aan voor bellers die de schijf gebruiken.
Behandel storingen met de methode System.Management.Automation.Provider.CmdletProvider.WriteError en geef vervolgens .
nullDeze methode geeft ofwel de schijfinformatie terug die aan de methode is doorgegeven, of een provider-specifieke versie ervan.
Dynamische parameters toevoegen aan NewDrive
De New-PSDrive cmdlet die door je schijfprovider wordt ondersteund, kan extra parameters vereisen. Om deze dynamische parameters aan de cmdlet te koppelen, implementeert de provider de System.Management.Automation.Provider.DriveDriveCmdletProvider.NewDriveDynamicParameters* -methode. Deze methode geeft een object terug dat eigenschappen en velden heeft met parsingattributen vergelijkbaar met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object .
Deze aanbieder van de dijschijf overrult deze methode niet. De volgende code toont echter de standaardimplementatie van deze methode:
Een schijf verwijderen
Om de databaseverbinding te sluiten, moet de schijfprovider de System.Management.Automation.Provider.DriveDriveCmdletProvider.RemoveDrive* methode implementeren. Deze methode sluit de verbinding met de schijf nadat alle provider-specifieke informatie is opgeschonen.
De volgende code toont de implementatie van de System.Management.Automation.Provider.DriveDriveCmdletProvider.RemoveDrive* methode voor deze schijfprovider:
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 de schijf verwijderd kan worden, zou de methode de informatie die via de drive parameter aan de methode is doorgegeven, moeten teruggeven. Als de schijf niet verwijderd kan worden, moet de methode een uitzondering schrijven en vervolgens teruggeven null. Als je provider deze methode niet overschrijft, geeft de standaardimplementatie van deze methode gewoon de doorgegeven schijfinformatie als invoer terug.
Standaardschijven initialiseren
Je schijfprovider implementeert de System.Management.Automation.Provider.DriveDriveCmdletProvider.InitializeDefaultDrives* methode om schijven te mounten. Bijvoorbeeld, de Active Directory-provider kan een schijf mounten voor de standaard naamgevingscontext als de computer is gekoppeld aan een domein.
Deze methode geeft een verzameling schijfinformatie terug over de geïnitialiseerde schijven, of een lege verzameling. De aanroep van deze methode gebeurt nadat de Windows PowerShell-runtime de System.Management.Automation.Provider.CmdletProvider.Start* -methode aanroept om de provider te initialiseren.
Deze drive provider overschrijft de System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* methode niet. De volgende code toont echter de standaardimplementatie, die een lege schijfcollectie teruggeeft:
Dingen om te onthouden bij het implementeren van InitializeDefaultDrives
Alle schijfproviders moeten een root-schijf koppelen om de gebruiker te helpen met de vindbaarheid. De root-drive kan locaties vermelden die als root dienen voor andere gemonteerde schijven. De Active Directory-provider kan bijvoorbeeld een drive maken die de naamgevingscontexten vermeldt die in de namingContext attributen van de root Distributed System Environment (DSE) worden gevonden. Dit helpt gebruikers om mountpunten voor andere schijven te ontdekken.
Codevoorbeeld
Voor volledige voorbeeldcode, zie AccessDbProviderSample02 Code Voorbeeld.
Het testen van de Windows PowerShell Drive Provider
Wanneer je Windows PowerShell-provider geregistreerd is bij Windows PowerShell, kun je dit testen door de ondersteunde cmdlets op de commandoregel uit te voeren, inclusief eventuele cmdlets die beschikbaar zijn gemaakt door derivatie. Laten we de aanbieder van de sample drive testen.
Voer de
Get-PSProvidercmdlet uit om de lijst met providers op te halen en ervoor te zorgen dat de AccessDB-schijfprovider 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 Data Sources-gedeelte van de Administratieve Tools voor het besturingssysteem. In de Gebruiker DSN-tabel dubbelklik je op MS Access Database en voeg je het schijfpad
C:\ps\northwind.mdbtoe.Maak een nieuwe schijf aan met de voorbeeldschijfprovider:
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 wordt gedefinieerd als een lid van de schijf, kun je deze controleren met de Get-PDDrive cmdlet.
Opmerking
De gebruiker kan nog niet met de provider als schijf communiceren, omdat de provider containerfunctionaliteit nodig heeft voor die interactie. Voor meer informatie, zie Het aanmaken van een Windows PowerShell Container Provider.
PS> (Get-PSDrive mydb). Verbinding
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 de schijf en verlaat de behuizing:
PS> Remove-PSDrive mydb PS> exit
Zie ook
Windows PowerShell-providers aanmaken