Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
Sprawdź, czy istnieje członek System.Management.Automation.PSDriveinfo.Root* oraz czy można nawiązać połączenie z magazynem danych.
Utwórz dysk i wypełnij członka połączenia, wspierając
New-PSDrivecmdlet.Zweryfikowaj obiekt System.Management.Automation.PSDriveinfo dla proponowanego dysku.
Zmodyfikuj obiekt System.Management.Automation.PSDriveinfo , który opisuje dysk z wymaganymi informacjami o wydajności lub niezawodności, albo udostępnij dodatkowe dane dla wywołujących korzystających z dysku.
Obsłuż awarie za pomocą metody System.Management.Automation.Provider.CmdletProvider.WriteError , a następnie zwróć
null.Ta metoda zwraca albo informacje o dysku przekazane metodzie, albo jej specyficzną dla dostawcy wersję.
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.
Uruchom
Get-PSProvidercmdlet, aby pobrać listę dostawców i upewnić się, że obecny jest dostawca dysku AccessDB:PS>
Get-PSProviderWyś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}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 .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.mdbZweryfikuj 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 :Usuń napęd i wyjdź z obudowy:
PS> Remove-PSDrive mydb PS> exit
Zobacz też
Tworzenie dostawców Windows PowerShell