Skapa en Windows PowerShell-enhetsprovider

Det här avsnittet beskriver hur du skapar en Windows PowerShell-enhetsprovider som ger ett sätt att komma åt ett datalager via Windows PowerShell enhet. Den här typen av provider kallas även för Windows PowerShell enhetsproviders. De Windows PowerShell enheter som används av providern ger möjlighet att ansluta till datalagret.

Enhetsprovidern Windows PowerShell beskrivs här ger åtkomst till en Microsoft Access-databas. För den här providern representerar Windows PowerShell-enheten databasen (det går att lägga till ett val annat antal enheter till en enhetsprovider), containrarna på den översta nivån på enheten representerar tabellerna i databasen och objekten i containrarna representerar raderna i tabellerna.

Definiera Windows PowerShell providerklass

Enhetsprovidern måste definiera en .NET-klass som härleds från basklassen System.Management.Automation.Provider.Drivecmdletprovider. Här är klassdefinitionen för den här enhetsprovidern:

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider

Observera att i det här exemplet anger attributet System.Management.Automation.Provider.Cmdletproviderattribute ett användarvänligt namn för providern och de Windows PowerShell-specifika funktioner som providern exponerar för Windows PowerShell-körningen under kommandobearbetningen. Möjliga värden för providerfunktionerna definieras av uppräkningen System.Management.Automation.Provider.Providercapabilities. Den här enhetsprovidern stöder inte någon av dessa funktioner.

Definiera grundläggande funktioner

Enligt beskrivningen i Designa din Windows PowerShell-providerhärleds klassen System.Management.Automation.Provider.Drivecmdletprovider från basklassen System.Management.Automation.Provider.Cmdletprovider som definierar de metoder som behövs för att initiera och oinitiera providern. Information om hur du implementerar funktioner för att lägga till sessionsspecifik initieringsinformation och frigöra resurser som används av providern finns i Skapa en grundläggande Windows PowerShell provider. De flesta leverantörer (inklusive providern som beskrivs här) kan dock använda standardimplementering av den här funktionen som tillhandahålls av Windows PowerShell.

Skapa information om enhetstillstånd

Alla Windows PowerShell providers betraktas som tillståndslösa, vilket innebär att enhetsprovidern måste skapa eventuell tillståndsinformation som krävs av Windows PowerShell-körningen när den anropar din leverantör.

För den här enhetsprovidern innehåller tillståndsinformationen anslutningen till databasen som sparas som en del av enhetsinformationen. Här är kod som visar hur den här informationen lagras i objektet System.Management.Automation.PSDriveinfo som beskriver enheten:

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

Skapa en enhet

För att Windows PowerShell köra en enhet måste enhetsprovidern implementera metoden System.Management.Automation.Provider.Drivecmdletprovider.Newdrive*. Följande kod visar implementeringen av metoden System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* för den här enhetsprovidern:

      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

Åsidosättningen av den här metoden bör göra följande:

Koppla dynamiska parametrar till NewDrive

New-PSDriveCmdleten som stöds av enhetsprovidern kan kräva ytterligare parametrar. För att koppla dessa dynamiska parametrar till cmdleten implementerar providern metoden System.Management.Automation.Provider.Drivecmdletprovider.Newdrivedynamicparameters*. Den här metoden returnerar ett objekt som har egenskaper och fält med parsningsattribut som liknar en cmdlet-klass eller ett System.Management.Automation.Runtimedefinedparameterdictionary-objekt.

Den här enhetsprovidern åsidosätter inte den här metoden. Följande kod visar dock standardimplementering av den här metoden:

Ta bort en enhet

Om du vill stänga databasanslutningen måste enhetsprovidern implementera metoden System.Management.Automation.Provider.Drivecmdletprovider.Removedrive*. Den här metoden stänger anslutningen till enheten efter rensning av providerspecifik information.

Följande kod visar implementeringen av metoden System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* för den här enhetsprovidern:

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

Om enheten kan tas bort ska metoden returnera den information som skickas till metoden via drive parametern . Om enheten inte kan tas bort ska metoden skriva ett undantag och sedan returnera null . Om leverantören inte åsidosätter den här metoden returnerar standardimplementering av den här metoden bara enhetsinformation som skickas som indata.

Initiera standardenheter

Enhetsprovidern implementerar metoden System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives* för att montera enheter. Active Directory-providern kan till exempel montera en enhet för standardnamngivningskontexten om datorn är ansluten till en domän.

Den här metoden returnerar en samling enhetsinformation om de initierade enheterna eller en tom samling. Anropet till den här metoden görs när Windows PowerShell runtime anropar metoden System.Management.Automation.Provider.Cmdletprovider.Start* för att initiera providern.

Den här enhetsprovidern åsidosätter inte metoden System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives*. Följande kod visar dock standardimplementering, som returnerar en tom enhetssamling:

Saker att komma ihåg om att implementera InitializeDefaultDrives

Alla enhetsproviders bör montera en rotenhet för att hjälpa användaren att identifiera. Rotenheten kan lista platser som fungerar som rötter för andra monterade enheter. Active Directory-providern kan till exempel skapa en enhet som visar en lista över namngivningskontexterna som finns i attributen i namingContext DSE (Root Distributed System Environment). Detta hjälper användarna att identifiera monteringspunkter för andra enheter.

Kodexempel

Fullständig exempelkod finns i AccessDbProviderSample02 Code Sample.

Testa Windows PowerShell enhetsprovidern

När din Windows PowerShell-provider har registrerats med Windows PowerShell kan du testa den genom att köra de cmdlets som stöds på kommandoraden, inklusive eventuella cmdlets som gjorts tillgängliga av frånkoppling. Vi testar provkörningsprovidern.

  1. Kör Get-PSProvider cmdleten för att hämta listan över providers för att säkerställa att AccessDB-enhetsprovidern finns:

    PS-> Get-PSProvider

    Följande utdata visas:

    Name                 Capabilities                  Drives
    ----                 ------------                  ------
    AccessDB             None                          {}
    Alias                ShouldProcess                 {Alias}
    Environment          ShouldProcess                 {Env}
    FileSystem           Filter, ShouldProcess         {C, Z}
    Function             ShouldProcess                 {function}
    Registry             ShouldProcess                 {HKLM, HKCU}
    
  2. Kontrollera att det finns ett databasservernamn (DSN) för databasen genom att öppna datakällorna i Administrationsverktyg för operativsystemet. I tabellen Användar-DSN dubbelklickar du på MS Access Database och lägger till enhetssökvägen C:\ps\northwind.mdb .

  3. Skapa en ny enhet med exempelenhetsprovidern:

    new-psdrive -name mydb -root c:\ps\northwind.mdb -psprovider AccessDb`
    

    Följande utdata visas:

    Name     Provider     Root                   CurrentLocation
    ----     --------     ----                   ---------------
    mydb     AccessDB     c:\ps\northwind.mdb
    
  4. Verifiera anslutningen. Eftersom anslutningen definieras som medlem i enheten kan du kontrollera den med hjälp av Get-PDDrive cmdlet.

    Anteckning

    Användaren kan ännu inte interagera med providern som en enhet eftersom providern behöver containerfunktioner för interaktionen. Mer information finns i Skapa en Windows PowerShell containerprovider.

    PS> (get-psdrive mydb).connection

    Följande utdata visas:

    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. Ta bort enheten och avsluta gränssnittet:

    PS> remove-psdrive mydb
    PS> exit
    

Se även

Skapa Windows PowerShell providers

Utforma din Windows PowerShell provider

Skapa en grundläggande Windows PowerShell-provider