Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í:
Ověřte, že člen System.Management.Automation.PSDriveinfo.Root* existuje a zda je možné navázat spojení s datovým úložištěm.
Vytvořte disk a naplňte člena připojení, aby podpořil
New-PSDrivecmdlet.Ověřte objekt System.Management.Automation.PSDriveinfo pro navrhovaný disk.
Upravte objekt System.Management.Automation.PSDriveinfo , který popisuje disk požadovanými informacemi o výkonu nebo spolehlivosti, nebo poskytněte další data volajícím používajícím disk.
Řešení selhání pomocí metody System.Management.Automation.Provider.CmdletProvider.WriteError a poté vraťte
null.Tato metoda vrací buď informace o disku, které byly metodě předány, nebo její verzi specifickou pro poskytovatele.
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ů.
Spusť
Get-PSProvidercmdlet pro získání seznamu poskytovatelů a ověřil se, že je přítomen poskytovatel disku AccessDB:PS>
Get-PSProviderObjeví 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}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 .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.mdbOvěř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 :Vyjměte disk a vystupte z obalu:
PS> Remove-PSDrive mydb PS> exit
Viz také
Vytváření poskytovatelů Windows PowerShell