Dela via


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 en 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.

Windows PowerShell-enhetsprovidern som 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 valfritt antal enheter till en enhetsprovider), de översta containrarna på enheten representerar tabellerna i databasen och containrarnas objekt representerar raderna i tabellerna.

Definiera Windows PowerShell-providerklassen

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

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

Observera att attributet System.Management.Automation.Provider.CmdletProviderAttribute i det här exemplet anger 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 System.Management.Automation.Provider.ProviderCapabilities uppräkning. Den här enhetsprovidern stöder inte någon av dessa funktioner.

Definiera basfunktioner

Enligt beskrivningen i Designa din Windows PowerShell-providerhärleds klassen System.Management.Automation.Provider.DriveCmdletProvider från klassen System.Management.Automation.Provider.CmdletProvider basklass som definierar de metoder som behövs för att initiera och inte initiera providern. Information om hur du implementerar funktioner för att lägga till sessionsspecifik initieringsinformation och för att 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 standardimplementeringen av den här funktionen som tillhandahålls av Windows PowerShell.

Skapa information om enhetstillstånd

Alla Windows PowerShell-leverantörer anses vara tillståndslösa, vilket innebär att enhetsprovidern behöver skapa tillståndsinformation som behö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örningen ska kunna skapa en enhet måste enhetsprovidern implementera metoden System.Management.Automation.Provider.DriveCmdletProvider.NewDrive*. Följande kod visar implementeringen av System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* metod 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

Den New-PSDrive cmdlet som stöds av enhetsprovidern kan kräva ytterligare parametrar. Om du vill 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 en System.Management.Automation.RuntimeDefinedParameterDictionary-objekt.

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

Ta bort en enhet

För att stänga databasanslutningen måste enhetsprovidern implementera metoden System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive*. Den här metoden stänger anslutningen till enheten efter att all providerspecifik information har rensats.

Följande kod visar implementeringen av System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* metod 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 parametern drive. Om enheten inte kan tas bort ska metoden skriva ett undantag och sedan returnera null. Om providern inte åsidosätter den här metoden returnerar standardimplementeringen av den här metoden bara enhetsinformationen som skickas som indata.

Initiera standardenheter

Enhetsprovidern implementerar System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* metod 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 efter att Windows PowerShell-körningen 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 standardimplementeringen, som returnerar en tom enhetssamling:

Saker att komma ihåg när du implementerar InitializeDefaultDrives

Alla enhetsprovidrar bör montera en rotenhet för att hjälpa användaren med identifiering. 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 de namngivningskontexter som finns i namingContext-attributen i roten DSE (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 cmdletar som stöds på kommandoraden, inklusive eventuella cmdletar som görs tillgängliga genom härledning. Nu ska vi testa exempelenhetsprovidern.

  1. Kör cmdleten Get-PSProvider för att hämta listan över leverantörer 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 komma åt datakällor del av Administrationsverktyg för operativsystemet. I tabellen User DSN dubbelklickar du på MS Access Database och lägger till enhetssökvägen C:\ps\northwind.mdb.

  3. Skapa en ny enhet med hjälp av 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 cmdleten Get-PDDrive.

    Anmärkning

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

    PS> (Get-PSDrive mydb). Anslutning

    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