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:

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.

  1. Voer de cmdlet uit om de lijst met providers op te halen om ervoor te Get-PSProvider zorgen dat de AccessDB-stationprovider aanwezig is:

    PS-> Get-PSProvider

    De 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}
    
  2. 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.mdb toe.

  3. 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.mdb
    
  4. Valideer 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         :
    
  5. Verwijder het station en sluit de shell:

    PS> remove-psdrive mydb
    PS> exit
    

Zie ook

Een Windows PowerShell maken

Uw Windows PowerShell-provider ontwerpen

Een eenvoudige Windows PowerShell-provider ontwerpen