Sdílet prostřednictvím


Vytvoření poskytovatele disku Windows PowerShell

Toto téma popisuje, jak vytvořit poskytovatele disku Windows PowerShell, který umožňuje přístup k datovému úložišti prostřednictvím disku Windows PowerShell. Tento typ poskytovatele je také označován jako poskytovatelé disků Windows PowerShell. Windows PowerShell disky používané poskytovatelem umožňují připojení k datovému úložišti.

Poskytovatel disku Windows PowerShell popsaný zde poskytuje přístup k databázi Microsoft Access. Pro tohoto poskytovatele disk Windows PowerShell představuje databázi (je možné přidat libovolný počet disků k poskytovateli disku), kontejnery nejvyšší úrovně disku představují tabulky v databázi a položky kontejnerů představují řádky v tabulkách.

Definování třídy poskytovatele Windows PowerShell

Váš poskytovatel disku musí definovat třídu .NET, která vychází ze základní třídy System.Management.Automation.Provider.DriveCmdletProvider . Zde je definice třídy tohoto poskytovatele disků:

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

Všimněte si, že v tomto příkladu atribut System.Management.Automation.Provider.CmdletProviderAttribute specifikuje uživatelsky přívětivé jméno poskytovatele a specifické schopnosti Windows PowerShell, které poskytovatel zpřístupňuje běhu Windows PowerShell během zpracování příkazů. Možné hodnoty pro schopnosti poskytovatele jsou definovány výčtem System.Management.Automation.Provider.ProviderCapabilities . Tento poskytovatel disků žádnou z těchto funkcí nepodporuje.

Definování základní funkcionality

Jak je popsáno v knize Design Your Windows PowerShell Provider, třída System.Management.Automation.Provider.DriveCmdletProvider vychází ze základní třídy System.Management.Automation.Provider.CmdletProvider , která definuje metody potřebné pro inicializaci a odinicializaci poskytovatele. Pro implementaci funkcí pro přidání inicializačních informací specifických pro relaci a pro uvolnění zdrojů používaných poskytovatelem viz Vytvoření základního poskytovatele Windows PowerShell. Většina poskytovatelů (včetně zde popsaného poskytovatele) však může použít výchozí implementaci této funkce, kterou poskytuje Windows PowerShell.

Vytváření informací o stavu disku

Všichni poskytovatelé Windows PowerShell jsou považováni za bezstavové, což znamená, že váš poskytovatel disku musí vytvořit jakékoli stavové informace, které potřebuje runtime Windows PowerShell, když volá vašeho poskytovatele.

Pro tohoto poskytovatele disku zahrnují informace o stavu spojení s databází, které je uchováváno jako součást informací o disku. Zde je kód, který ukazuje, jak jsou tyto informace uloženy v objektu System.Management.Automation.PSDriveinfo , který popisuje disk:

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

Vytvoření pohonu

Aby mohl provoz Windows PowerShell vytvořit disk, musí poskytovatel disku implementovat metodu System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* . Následující kód ukazuje implementaci metody System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* pro tohoto poskytovatele disků:

      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

Vaše přepsání této metody by mělo udělat následující:

Připojení dynamických parametrů k NewDrive

CMDLET podporovaný New-PSDrive vaším poskytovatelem disků může vyžadovat další parametry. Pro připojení těchto dynamických parametrů k cmdletu poskytovatel implementuje metodu System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters* . Tato metoda vrací objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary .

Tento poskytovatel disku tuto metodu nepřepsává. Následující kód však ukazuje výchozí implementaci této metody:

Odstranění disku

Pro uzavření databázového připojení musí poskytovatel disku implementovat metodu System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* . Tato metoda ukončí spojení s diskem po vyčištění všech informací specifických pro poskytovatele.

Následující kód ukazuje implementaci metody System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* pro tohoto poskytovatele disků:

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

Pokud lze disk vyjmout, metoda by měla vrátit informace předané metodě přes parametr.drive Pokud disk nelze odstranit, metoda by měla napsat výjimku a poté vrátit null. Pokud váš poskytovatel tuto metodu nepřepsá, výchozí implementace této metody pouze vrátí informace o disku jako vstup.

Inicializace výchozích disků

Váš poskytovatel disků implementuje metodu System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* pro připojování disků. Například poskytovatel Active Directory může připojit disk pro výchozí kontext pojmenování, pokud je počítač připojen k doméně.

Tato metoda vrací sbírku informací o disku o inicializovaných discích, tedy prázdnou kolekci. Volání této metody je provedeno poté, co runtime Windows PowerShell vyvolá metodu System.Management.Automation.Provider.CmdletProvider.Start* k inicializaci poskytovatele.

Tento poskytovatel disků nepřepisuje metodu System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* . Následující kód však ukazuje výchozí implementaci, která vrací prázdnou kolekci disků:

Na co si pamatovat při implementaci InitializeDefaultDrives

Všichni poskytovatelé disků by měli připojit root disk, aby uživateli usnadnili objevitelnost. Root disk může uvádět místa, která slouží jako kořeny pro jiné připojené disky. Například poskytovatel Active Directory může vytvořit disk, který uvádí kontexty pojmenovávání nalezené v atributech namingContext na kořenovém Distributed System Environment (DSE). To pomáhá uživatelům objevovat montážní body pro jiné disky.

Ukázka kódu

Pro kompletní ukázkový kód viz AccessDbProviderSample02 Code Sample.

Testování poskytovatele Windows PowerShell Drive

Když je váš poskytovatel Windows PowerShell registrován ve Windows PowerShell, můžete jej otestovat spuštěním podporovaných cmdlets na příkazovém řádku, včetně jakýchkoli cmdlets dostupných odvozením. Otestujme poskytovatele vzorkových disků.

  1. Spusť Get-PSProvider cmdlet pro získání seznamu poskytovatelů a ověřil se, že je přítomen poskytovatel disku AccessDB:

    PS>Get-PSProvider

    Objeví se následující výstup:

    Name                 Capabilities                  Drives
    ----                 ------------                  ------
    AccessDB             None                          {}
    Alias                ShouldProcess                 {Alias}
    Environment          ShouldProcess                 {Env}
    FileSystem           Filter, ShouldProcess         {C, Z}
    Function             ShouldProcess                 {function}
    Registry             ShouldProcess                 {HKLM, HKCU}
    
  2. Ujistěte se, že pro databázi existuje název databázového serveru (DSN) přístupem k části Zdroje dat v Administrativních nástrojích operačního systému. V tabulce User DSN klikněte na MS Access Database a přidejte cestu C:\ps\northwind.mdbdisku .

  3. Vytvořte nový disk pomocí poskytovatele vzorkovacího disku:

    New-PSDrive -Name mydb -Root C:\ps\northwind.mdb -PSProvider AccessDb`
    

    Objeví se následující výstup:

    Name     Provider     Root                   CurrentLocation
    ----     --------     ----                   ---------------
    mydb     AccessDB     C:\ps\northwind.mdb
    
  4. Ověřte spojení. Protože je spojení definováno jako člen disku, můžete to zkontrolovat pomocí Get-PDDrive cmdletu.

    Poznámka:

    Uživatel zatím nemůže interagovat s poskytovatelem jako s diskem, protože poskytovatel potřebuje pro tuto interakci funkčnost kontejneru. Pro více informací viz Vytvoření poskytovatele kontejnerů Windows PowerShell.

    PS> (Get-PSDrive mydb). Připojení

    Objeví se následující výstup:

    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. Vyjměte disk a vystupte z obalu:

    PS> Remove-PSDrive mydb
    PS> exit
    

Viz také

Vytváření poskytovatelů Windows PowerShell

Navrhněte svého poskytovatele Windows PowerShell

Vytvoření základního poskytovatele Windows PowerShell