Tworzenie dostawcy dysku programu Windows PowerShell

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

Dostawca Windows PowerShell dysków twardych opisany w tym miejscu zapewnia dostęp do bazy danych programu Microsoft Access. W przypadku tego dostawcy dysk 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 Windows PowerShell dostawcy

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

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

Należy zauważyć, że w tym przykładzie atrybut System.Management.Automation.Provider.Cmdletproviderattribute określa przyjazną dla użytkownika nazwę dostawcy i określone możliwości usługi Windows PowerShell, które dostawca uwidacznia w środowisku uruchomieniowym programu Windows PowerShell podczas przetwarzania poleceń. Możliwe wartości dla możliwości dostawcy są definiowane przez wyliczenie System.Management.Automation.Provider.Providercapabilities. Ten dostawca dysków nie obsługuje żadnej z tych możliwości.

Definiowanie podstawowych funkcji

Zgodnie z opisem w tece Design Your Windows PowerShell Provider(Projektowanie dostawcy usługi Windows PowerShell) klasa System.Management.Automation.Provider.Drivecmdletprovider pochodzi z klasy bazowej System.Management.Automation.Provider.Cmdletprovider, która definiuje metody niezbędne do inicjowania i niezainicjowania dostawcy. Aby zaimplementować funkcjonalność dodawania informacji o inicjowaniu specyficznym dla sesji i zwalniania zasobów używanych przez dostawcę,zobacz Tworzenie podstawowego Windows PowerShell dostawcy . Jednak większość dostawców (w tym dostawca opisany tutaj) może używać domyślnej implementacji tej funkcji udostępnianej przez Windows PowerShell.

Tworzenie informacji o stanie dysku

Wszyscy Windows PowerShell są traktowani jako bez stanowi, co oznacza, że dostawca dysków musi utworzyć wszelkie informacje o stanie, które są wymagane przez środowisko uruchomieniowe Windows PowerShell podczas wywołania dostawcy.

Dla tego dostawcy dysków informacje o stanie obejmują połączenie z bazą danych, która jest przechowywana jako część informacji o dysku. Oto kod, który pokazuje, jak te informacje są przechowywane 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ć Windows PowerShell uruchomieniowemu, 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 New-PSDrive cmdlet obsługiwane przez dostawcę dysku 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, który ma właściwości i pola z atrybutami analizy podobnymi do klasy polecenia cmdlet lub obiektu 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 dyskem po oczyszczeniu dowolnych 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 drive parametru . Jeśli nie można usunąć dysku, metoda powinna zapisać wyjątek, a następnie zwrócić null . Jeśli dostawca nie zastępuje tej metody, domyślna implementacja tej metody po prostu zwraca informacje o dysku przekazane jako dane wejściowe.

Inicjowanie dysków domyślnych

Dostawca dysków implementuje metodę System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives*, aby zainstalować dyski. 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 o zainicjowanych dyskach lub pustą kolekcję. Wywołanie tej metody jest dokonywane, gdy środowisko uruchomieniowe Windows PowerShell wywoła metodę System.Management.Automation.Provider.Cmdletprovider.Start*, aby zainicjować dostawcę.

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

Co należy pamiętać o implementowania 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, który wyświetla listę kontekstów nazewnictwa znalezionych w atrybutach w głównym rozproszonym środowisku namingContext systemowym (DSE). Ułatwia to użytkownikom odnajdywanie punktów instalacji dla innych dysków.

Przykład kodu

Aby uzyskać kompletny przykładowy kod, zobacz AccessDbProviderSample02 Code Sample (Przykładowy kod AccessDbProviderSample02).

Testowanie Windows PowerShell dysku twardego

Po zarejestrowaniu Windows PowerShell usługi Windows PowerShell można go przetestować, uruchamiając obsługiwane polecenia cmdlet w wierszu polecenia, w tym wszystkie polecenia cmdlet udostępnione przez wyprowadzenie. Przetestujmy przykładowego dostawcę dysków.

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

    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 baza danych zawiera nazwę serwera bazy danych (DSN), korzystając ze źródła danych w części Narzędzia administracyjne dla systemu operacyjnego. W tabeli DSN użytkownika kliknij dwukrotnie bazę danych programu MS Access i dodaj ścieżkę dysku C:\ps\northwind.mdb .

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

    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żna to sprawdzić za pomocą Get-PDDrive cmdlet.

    Uwaga

    Użytkownik nie może jeszcze wchodzić w interakcje z dostawcą jako dysk, ponieważ dostawca potrzebuje funkcji kontenera na potrzeby tej interakcji. Aby uzyskać więcej informacji, zobacz Creating a Windows PowerShell Container Provider (Tworzenie Windows PowerShell kontenera).

    PS> (get-psdrive mydb).connection

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

    PS> remove-psdrive mydb
    PS> exit
    

Zobacz też

Tworzenie Windows PowerShell dostawców

Projektowanie dostawcy Windows PowerShell projektowego

Tworzenie podstawowego dostawcy programu Windows PowerShell