Udostępnij za pomocą


Tworzenie dostawcy dysku Windows PowerShell

Ten temat opisuje, jak stworzyć dostawcę dysku Windows PowerShell, który umożliwia dostęp do magazynu danych za pomocą dysku Windows PowerShell. Ten typ dostawcy nazywany jest również dostawcami dysków Windows PowerShell. Dyski Windows PowerShell używane przez dostawcy umożliwiają połączenie z magazynem danych.

Opisany tutaj dostawca dysków Windows PowerShell zapewnia dostęp do bazy danych Microsoft Access. Dla tego dostawcy dysk Windows PowerShell reprezentuje bazę danych (można dodać dowolną liczbę dysków do dostawcy dysku), kontenery najwyższego poziomu dysku reprezentują tabele w bazie danych, a elementy kontenerów wiersze w tabelach.

Definiowanie klasy dostawcy Windows PowerShell

Twój dostawca dysku musi zdefiniować klasę .NET pochodzącą z klasy bazowej System.Management.Automation.Provider.DriveCmdletProvider . Oto definicja klasy tego dostawcy dysku:

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

Zwróć uwagę, że w tym przykładzie atrybut System.Management.Automation.Provider.CmdletProviderAttribute określa przyjazną dla użytkownika nazwę dostawcy oraz specyficzne dla Windows PowerShell możliwości, które dostawca udostępnia środowisku wykonawczemu Windows PowerShell podczas przetwarzania poleceń. Możliwe wartości dla możliwości dostawcy są definiowane przez enumerację System.Management.Automation.Provider.ProviderCapabilities . Ten dostawca dysków nie obsługuje żadnej z tych funkcji.

Definiowanie funkcjonalności bazowej

Jak opisano w sekcji Design Your Windows PowerShell Provider, klasa System.Management.Automation.Provider.DriveCmdletProvider pochodzi z klasy bazowej System.Management.Automation.Provider.CmdletProvider , która definiuje metody potrzebne do inicjalizacji i odinicjalizacji providera. Aby zaimplementować funkcje dodawania informacji inicjalizacyjnych specyficznych dla sesji oraz uwalniania zasobów używanych przez dostawcę, zobacz Tworzenie podstawowego dostawcy Windows PowerShell. Jednak większość dostawców (w tym opisany tutaj) może korzystać z domyślnej implementacji tej funkcjonalności oferowanej przez Windows PowerShell.

Tworzenie informacji o stanie dysku

Wszyscy dostawcy Windows PowerShell są uznawani za bezstanowe, co oznacza, że Twój dostawca dysku musi utworzyć wszelkie informacje o stanie potrzebne przez środowisko wykonawcze Windows PowerShell, gdy wywołuje twojego operatora.

Dla tego dostawcy dysku informacje o stanie obejmują połączenie z bazą danych, które jest przechowywane jako część informacji o dysku. Oto kod, który pokazuje, jak te informacje są przechowywane w obiekcie System.Management.Automation.PSDriveinfo opisującym dysk:

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

Tworzenie napędu

Aby umożliwić uruchomieniu Windows PowerShell utworzenie dysku, dostawca dysku musi zaimplementować metodę System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* . Poniższy kod pokazuje implementację metody System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* dla tego dostawcy dysku:

      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

Twoje nadpisanie tej metody powinno robić następujące rzeczy:

Przypisywanie parametrów dynamicznych do NewDrive

Cmdlet obsługiwany New-PSDrive przez twojego dostawcę dysku może wymagać dodatkowych parametrów. Aby dołączyć te parametry dynamiczne do cmdletu, dostawca implementuje metodę System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters* . Ta metoda zwraca obiekt posiadający właściwości i pola z atrybutami parsowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary .

Ten dostawca dysku nie nadpisuje tej metody. Jednak poniższy kod pokazuje domyślną implementację tej metody:

Usuwanie dysku

Aby zamknąć połączenie bazy danych, dostawca dysku musi wdrożyć metodę System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* . Ta metoda zamyka połączenie z dysku po wyczyszczeniu wszelkich informacji specyficznych dla operatora.

Poniższy kod pokazuje implementację metody System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* dla tego dostawcy dysków:

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

Jeśli napęd można usunąć, metoda powinna zwracać informacje przekazane metodzie przez parametr.drive Jeśli dysku nie da się usunąć, metoda powinna zapisać wyjątek, a następnie zwrócić null. Jeśli Twój dostawca nie nadpisuje tej metody, domyślna implementacja zwraca jedynie informacje o dysku przekazane jako wejście.

Inicjalizacja dysków domyślnych

Twój dostawca dysków implementuje metodę System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* do montowania dysków. Na przykład dostawca Active Directory może zamontować dysk dla domyślnego kontekstu nazewnictwa, jeśli komputer jest połączony z domeną.

Ta metoda zwraca zbiór informacji o dyskach zainicjalizowanych lub pustą kolekcję. Wywołanie tej metody jest wykonywane po wywołaniu przez środowisko uruchomieniowe Windows PowerShell metody System.Management.Automation.Provider.CmdletProvider.Start*, aby inicjować dostawcę.

Ten dostawca dysku nie nadpisuje metody System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* . Jednak poniższy kod pokazuje domyślną implementację, która zwraca kolekcję pustych dysków:

Rzeczy, o których warto pamiętać przy implementacji InitializeDefaultDrives

Wszyscy dostawcy dysków powinni zainstalować root drive, aby ułatwić użytkownikowi wykrywalność. Dysk root może wymieniać lokalizacje, które służą jako root dla innych zamontowanych dysków. Na przykład dostawca Active Directory może utworzyć dysku, który wymienia konteksty nazewnictwa znajdujące się w atrybutach namingContext głównego Distributed System Environment (DSE). Pomaga to użytkownikom odkrywać punkty montażu dla innych dysków.

Przykładowy kod

Pełny przykładowy kod można znaleźć w AccessDbProviderSample02 Code Sample.

Testowanie dostawcy dysków Windows PowerShell

Gdy Twój dostawca Windows PowerShell zostanie zarejestrowany w Windows PowerShell, możesz go przetestować, uruchamiając obsługiwane cmdlets w wierszu poleceń, w tym dowolne cmdlets udostępnione przez derywację. Przetestujmy dostawcę próbek do dysku.

  1. Uruchom Get-PSProvider cmdlet, aby pobrać listę dostawców i upewnić się, że obecny jest dostawca dysku AccessDB:

    PS>Get-PSProvider

    Wyświetlane są następujące dane wyjściowe:

    Name                 Capabilities                  Drives
    ----                 ------------                  ------
    AccessDB             None                          {}
    Alias                ShouldProcess                 {Alias}
    Environment          ShouldProcess                 {Env}
    FileSystem           Filter, ShouldProcess         {C, Z}
    Function             ShouldProcess                 {function}
    Registry             ShouldProcess                 {HKLM, HKCU}
    
  2. Upewnij się, że istnieje nazwa serwera bazy danych (DSN) dla bazy, korzystając z części Źródła Danych w narzędziach administracyjnych systemu operacyjnego. W tabeli User DSN kliknij dwukrotnie MS Access Database i dodaj ścieżkę C:\ps\northwind.mdbdysku .

  3. Utwórz nowy dysk za pomocą dostawcy próbkowego napędu:

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

    Wyświetlane są następujące dane wyjściowe:

    Name     Provider     Root                   CurrentLocation
    ----     --------     ----                   ---------------
    mydb     AccessDB     C:\ps\northwind.mdb
    
  4. Zweryfikuj połączenie. Ponieważ połączenie jest zdefiniowane jako członek dysku, możesz je sprawdzić za pomocą przycisku Get-PDDrive.

    Uwaga / Notatka

    Użytkownik nie może jeszcze wchodzić w interakcję z dostawcą jako z dysku, ponieważ dostawca potrzebuje funkcjonalności kontenera do tej interakcji. Więcej informacji można znaleźć w artykule Tworzenie dostawcy kontenerów Windows PowerShell.

    PS> (Get-PSDrive mydb). Połączenie

    Wyświetlane są następujące dane wyjściowe:

    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. Usuń napęd i wyjdź z obudowy:

    PS> Remove-PSDrive mydb
    PS> exit
    

Zobacz też

Tworzenie dostawców Windows PowerShell

Zaprojektuj swojego dostawcy Windows PowerShell

Tworzenie podstawowego dostawcy Windows PowerShell