Skapa en Windows PowerShell-enhetsleverantör

Detta ämne beskriver hur man skapar en Windows PowerShell-enhetsleverantör som ger ett sätt att komma åt en datalagring via en Windows PowerShell-enhet. Denna typ av leverantör kallas också Windows PowerShell-enhetsleverantörer. De Windows PowerShell-enheter som används av leverantören ger möjlighet att ansluta till datalagret.

Den Windows PowerShell-enhetsleverantör som beskrivs här ger tillgång till en Microsoft Access-databas. För denna leverantör representerar Windows PowerShell-enheten databasen (det är möjligt att lägga till valfritt antal enheter till en enhetsleverantör), toppnivå-containrarna för enheten representerar tabellerna i databasen, och elementen i containrarna representerar raderna i tabellerna.

Definiera Windows PowerShell Provider Class

Din enhetsleverantör måste definiera en .NET-klass som härstammar från System.Management.Automation.Provider.DriveCmdletProvider-basklassen . Här är klassdefinitionen för denna enhetsleverantör:

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

Observera att i detta exempel specificerar attributet System.Management.Automation.Provider.CmdletProviderAttribute ett användarvänligt namn för leverantören och de Windows PowerShell-specifika funktioner som leverantören exponerar i Windows PowerShell-runtime under kommandobearbetningen. De möjliga värdena för leverantörens kapabiliteter definieras av System.Management.Automation.Provider.ProviderCapabilities-uppräkningen . Denna enhetsleverantör stöder inte någon av dessa funktioner.

Definiera basfunktionalitet

Som beskrivs i Design Your Windows PowerShell Provider härstammar System.Management.Automation.Provider.DriveCmdletProvider-klassen från basklassen System.Management.Automation.Provider.CmdletProvider som definierar metoderna som behövs för att initiera och avinitialisera providern. För att implementera funktionalitet för att lägga till sessionsspecifik initialiseringsinformation och för att släppa resurser som används av leverantören, se Skapa en grundläggande Windows PowerShell-leverantör. De flesta leverantörer (inklusive den som beskrivs här) kan dock använda standardimplementeringen av denna funktionalitet som tillhandahålls av Windows PowerShell.

Skapa information om drivtillstånd

Alla Windows PowerShell-leverantörer anses vara tillståndslösa, vilket innebär att din enhetsleverantör måste skapa all statusinformation som behövs av Windows PowerShell-runtime när den anropar din leverantör.

För denna enhetsleverantör inkluderar tillståndsinformation anslutningen till databasen som lagras som en del av diskinformationen. Här är kod som visar hur denna information 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 tillåta Windows PowerShell-runtime att skapa en disk måste enhetsleverantören implementera System.Management.Automation.Provider.DriveDriveCmdletProvider.NewDrive* -metoden. Följande kod visar implementeringen av System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* för denna enhetsleverantör:

      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

Din överskrivning av denna metod bör göra följande:

Att koppla dynamiska parametrar till NewDrive

Cmdleten New-PSDrive som stöds av din enhetsleverantör kan kräva ytterligare parametrar. För att koppla dessa dynamiska parametrar till cmdleten implementerar leverantören metoden System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters* . Denna metod returnerar ett objekt som har egenskaper och fält med parsningsattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt .

Denna drivleverantör åsidosätter inte denna metod. Följande kod visar dock standardimplementeringen av denna metod:

Ta bort en enhet

För att stänga databasanslutningen måste enhetsleverantören implementera metoden System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* . Denna metod stänger anslutningen till enheten efter att all leverantörsspecifik information har rensats.

Följande kod visar implementeringen av System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* för denna enhetsleverantör:

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 bör metoden returnera informationen som skickas till metoden via parametern drive . Om enheten inte kan tas bort bör metoden skriva ett undantag och sedan returnera null. Om din leverantör inte åsidosätter denna metod, returnerar standardimplementeringen bara den diskinformation som skickats som inmatning.

Initiering av standarddiskar

Din enhetsleverantör implementerar System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* för att montera diskar. Till exempel kan Active Directory-leverantören montera en enhet för standardnamngivningskontexten om datorn är ansluten till en domän.

Denna metod returnerar en samling av diskinformation om de initierade enheterna, eller en tom samling. Anropet till denna metod görs efter att Windows PowerShell-runtime anropar System.Management.Automation.Provider.CmdletProvider.Start*- metoden för att initiera providern.

Denna enhetsleverantör åsidosätter inte System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* -metoden. Följande kod visar dock standardimplementationen, som returnerar en tom samling av diskar:

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

Alla enhetsleverantörer bör montera en root-disk för att hjälpa användaren att hitta den. Root-disken kan lista platser som fungerar som roots för andra monterade enheter. Till exempel kan Active Directory-leverantören skapa en enhet som listar namngivningskontexterna som finns i attributen namingContext på roten Distributed System Environment (DSE). Detta hjälper användare att hitta monteringspunkter för andra enheter.

Kodexempel

För komplett exempelkod, se AccessDbProviderSample02 Code Sample.

Testning av Windows PowerShell Drive Provider

När din Windows PowerShell-leverantör har registrerats hos Windows PowerShell kan du testa den genom att köra de stödda cmdletarna på kommandoraden, inklusive eventuella cmdlets som gjorts tillgängliga genom derivation. Låt oss testa leverantören av provdiskar.

  1. Kör cmdleten Get-PSProvider för att hämta listan över leverantörer och säkerställa att AccessDB-enhetsleverantören är närvarande:

    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. Säkerställ att ett databasservernamn (DSN) finns för databasen genom att komma åt datakällorna i operativsystemets administrativa verktyg. I tabellen User DSN , dubbelklicka på MS Access Database och lägg till diskvägen C:\ps\northwind.mdb.

  3. Skapa en ny enhet med exempelenhetsleverantören:

    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 en medlem av enheten kan du kontrollera den med Get-PDDrive-cmdleten.

    Anmärkning

    Användaren kan ännu inte interagera med leverantören som en enhet, eftersom leverantören behöver containerfunktionalitet för den interaktionen. För mer information, se Skapa en Windows PowerShell Container Provider.

    PS> (Get-PSDrive mydb). Samband

    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 skalet:

    PS> Remove-PSDrive mydb
    PS> exit
    

Se även

Skapa Windows PowerShell-leverantörer

Designa din Windows PowerShell-leverantör

Skapa en grundläggande Windows PowerShell-leverantör