Udostępnij za pośrednictwem


Tworzenie dostawcy dysków programu Windows PowerShell

W tym temacie opisano sposób tworzenia dostawcy dysków programu Windows PowerShell, który zapewnia dostęp do magazynu danych za pośrednictwem dysku programu Windows PowerShell. Ten typ dostawcy jest również określany jako dostawcy dysków programu Windows PowerShell. Dyski programu Windows PowerShell używane przez dostawcę zapewniają środki łączenia się z magazynem danych.

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

Definiowanie klasy dostawcy programu Windows PowerShell

Dostawca dysków musi zdefiniować klasę .NET pochodzącą z klasy bazowej System.Management.Automation.Provider.DriveCmdletProvider. Oto definicja klasy dla tego dostawcy dysków:

[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 i możliwości specyficzne dla programu Windows PowerShell, które dostawca uwidacznia środowisku uruchomieniowemu programu Windows PowerShell podczas przetwarzania poleceń. Możliwe wartości możliwości dostawcy są definiowane przez wyliczenie System.Management.Automation.Provider.ProviderCapabil ities. Ten dostawca dysków nie obsługuje żadnej z tych funkcji.

Definiowanie podstawowych funkcji

Zgodnie z opisem w Design Your Windows PowerShell Provider, klasa System.Management.Automation.Provider.DriveCmdletProvider pochodzi z klasy System.Management.Automation.Provider.CmdletProvider klasy bazowej, która definiuje metody wymagane do inicjowania i uninitializowania dostawcy. Aby zaimplementować funkcje dodawania informacji inicjalizacji specyficznych dla sesji i udostępniania zasobów używanych przez dostawcę, zobacz Tworzenie podstawowego dostawcy programu Windows PowerShell. Jednak większość dostawców (w tym dostawcy opisanych tutaj) może używać domyślnej implementacji tej funkcji, która jest dostarczana przez program Windows PowerShell.

Tworzenie informacji o stanie dysku

Wszyscy dostawcy programu Windows PowerShell są traktowani jako bezstanowi, co oznacza, że dostawca dysków musi utworzyć wszelkie informacje o stanie wymagane przez środowisko uruchomieniowe programu Windows PowerShell, gdy wywołuje dostawcę.

W przypadku tego dostawcy dysków informacje o stanie obejmują połączenie z bazą danych, która jest przechowywana jako część informacji o dysku. Oto kod pokazujący sposób przechowywania tych informacji w obiekcie System.Management.Automation.PSDriveinfo opisujący 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 dysku

Aby umożliwić środowisku uruchomieniowemu programu Windows PowerShell utworzenie dysku, dostawca dysków musi zaimplementować metodę System.Management.Automation.Provider.DriveCmdletProvider.NewDrive*. Poniższy kod przedstawia implementację metody System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* dla tego dostawcy dysków:

      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

Zastąpienie tej metody powinno wykonać następujące czynności:

Dołączanie parametrów dynamicznych do usługi NewDrive

Polecenie cmdlet New-PSDrive obsługiwane przez dostawcę dysków może wymagać dodatkowych parametrów. Aby dołączyć te parametry dynamiczne do polecenia cmdlet, dostawca implementuje metodę System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters*. Ta metoda zwraca obiekt zawierający właściwości i pola z atrybutami analizowania podobnymi do klasy poleceń cmdlet lub System.Management.Automation.RuntimeDefinedParameterDictionary.

Ten dostawca dysków nie zastępuje tej metody. Jednak poniższy kod przedstawia domyślną implementację tej metody:

Usuwanie dysku

Aby zamknąć połączenie z bazą danych, dostawca dysków musi zaimplementować metodę System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive*. Ta metoda zamyka połączenie z dyskiem po oczyszczeniu wszelkich informacji specyficznych dla dostawcy.

Poniższy kod przedstawia 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 dysk można usunąć, metoda powinna zwrócić informacje przekazane do metody za pośrednictwem parametru drive. Jeśli nie można usunąć dysku, metoda powinna zapisać wyjątek, a następnie zwrócić null. Jeśli dostawca nie zastąpi tej metody, domyślna implementacja tej metody zwraca tylko informacje o dysku przekazane jako dane wejściowe.

Inicjowanie dysków domyślnych

Dostawca dysków implementuje metodę System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* metodę instalowania dysków. Na przykład dostawca usługi Active Directory może zainstalować dysk dla domyślnego kontekstu nazewnictwa, jeśli komputer jest przyłączony do domeny.

Ta metoda zwraca kolekcję informacji o dyskach zainicjowanych lub pustej kolekcji. Wywołanie tej metody jest wykonywane po wywołaniu środowiska uruchomieniowego programu Windows PowerShell wywołanie metody System.Management.Automation.Provider.CmdletProvider.Start* metody w celu zainicjowania dostawcy.

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

Co należy pamiętać o implementowaniu initializeDefaultDrives

Wszyscy dostawcy dysków powinni zainstalować dysk główny, aby ułatwić użytkownikowi odnajdywanie. Dysk główny może zawierać listę lokalizacji, które służą jako katalogi główne dla innych zainstalowanych dysków. Na przykład dostawca usługi Active Directory może utworzyć dysk zawierający listę kontekstów nazewnictwa znalezionych w atrybutach namingContext w głównym rozproszonym środowisku systemowym (DSE). Ułatwia to użytkownikom odnajdywanie punktów instalacji dla innych dysków.

Przykładowy kod

Aby uzyskać pełny przykładowy kod, zobacz AccessDbProviderSample02 Code Sample.

Testowanie dostawcy dysków programu Windows PowerShell

Jeśli dostawca programu Windows PowerShell został zarejestrowany w programie Windows PowerShell, możesz go przetestować, uruchamiając obsługiwane polecenia cmdlet w wierszu polecenia, w tym wszystkie polecenia cmdlet udostępniane przez wyprowadzanie. Przetestujmy przykładowego dostawcę dysku.

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

    > Get-PSProvider PS

    Zostanie wyświetlone 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 dla bazy danych istnieje nazwa serwera bazy danych (DSN), korzystając z Źródła danych, części Narzędzia administracyjne dla systemu operacyjnego. W tabeli User DSN kliknij dwukrotnie ms Access Database i dodaj ścieżkę dysku C:\ps\northwind.mdb.

  3. Utwórz nowy dysk przy użyciu dostawcy dysków przykładowych:

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

    Zostanie wyświetlone 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 element członkowski dysku, możesz go sprawdzić przy użyciu polecenia cmdlet Get-PDDrive.

    Uwaga

    Użytkownik nie może jeszcze korzystać z dostawcy jako dysku, ponieważ dostawca potrzebuje funkcji kontenera dla tej interakcji. Aby uzyskać więcej informacji, zobacz Tworzenie dostawcy kontenera programu Windows PowerShell.

    > PS (Get-PSDrive mydb). połączenia

    Zostanie wyświetlone 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ń dysk i zamknij powłokę:

    PS> Remove-PSDrive mydb
    PS> exit
    

Zobacz też

tworzenie dostawców programu Windows PowerShell

projektowanie dostawcy programu Windows PowerShell

tworzenie podstawowego dostawcy programu Windows PowerShell