Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Detta ämne beskriver hur man skapar en Windows PowerShell-enhetsleverantör som ger ett sätt att komma åt en datalagring via en Windows PowerShell-enhet. Denna typ av leverantör kallas också Windows PowerShell-enhetsleverantörer. De Windows PowerShell-enheter som används av leverantören ger möjlighet att ansluta till datalagret.
Den Windows PowerShell-enhetsleverantör som beskrivs här ger tillgång till en Microsoft Access-databas. För denna leverantör representerar Windows PowerShell-enheten databasen (det är möjligt att lägga till valfritt antal enheter till en enhetsleverantör), toppnivå-containrarna för enheten representerar tabellerna i databasen, och elementen i containrarna representerar raderna i tabellerna.
Definiera Windows PowerShell Provider Class
Din enhetsleverantör måste definiera en .NET-klass som härstammar från System.Management.Automation.Provider.DriveCmdletProvider-basklassen . Här är klassdefinitionen för denna enhetsleverantör:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
Observera att i detta exempel specificerar attributet System.Management.Automation.Provider.CmdletProviderAttribute ett användarvänligt namn för leverantören och de Windows PowerShell-specifika funktioner som leverantören exponerar i Windows PowerShell-runtime under kommandobearbetningen. De möjliga värdena för leverantörens kapabiliteter definieras av System.Management.Automation.Provider.ProviderCapabilities-uppräkningen . Denna enhetsleverantör stöder inte någon av dessa funktioner.
Definiera basfunktionalitet
Som beskrivs i Design Your Windows PowerShell Provider härstammar System.Management.Automation.Provider.DriveCmdletProvider-klassen från basklassen System.Management.Automation.Provider.CmdletProvider som definierar metoderna som behövs för att initiera och avinitialisera providern. För att implementera funktionalitet för att lägga till sessionsspecifik initialiseringsinformation och för att släppa resurser som används av leverantören, se Skapa en grundläggande Windows PowerShell-leverantör. De flesta leverantörer (inklusive den som beskrivs här) kan dock använda standardimplementeringen av denna funktionalitet som tillhandahålls av Windows PowerShell.
Skapa information om drivtillstånd
Alla Windows PowerShell-leverantörer anses vara tillståndslösa, vilket innebär att din enhetsleverantör måste skapa all statusinformation som behövs av Windows PowerShell-runtime när den anropar din leverantör.
För denna enhetsleverantör inkluderar tillståndsinformation anslutningen till databasen som lagras som en del av diskinformationen. Här är kod som visar hur denna information lagras i Objektet System.Management.Automation.PSDriveinfo som beskriver enheten:
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
Skapa en enhet
För att tillåta Windows PowerShell-runtime att skapa en disk måste enhetsleverantören implementera System.Management.Automation.Provider.DriveDriveCmdletProvider.NewDrive* -metoden. Följande kod visar implementeringen av System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* för denna enhetsleverantör:
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
Din överskrivning av denna metod bör göra följande:
Verifiera att medlemmen System.Management.Automation.PSDriveinfo.Root* finns och att en anslutning till datamagasinet kan göras.
Skapa en enhet och fyll i anslutningsmedlemmen till stöd för
New-PSDrivecmdleten.Validera objektet System.Management.Automation.PSDriveinfo för den föreslagna enheten.
Modifiera Objektet System.Management.Automation.PSDriveinfo som beskriver enheten med nödvändig prestanda- eller tillförlitlighetsinformation, eller tillhandahålla extra data för anropare som använder enheten.
Hantera fel med metoden System.Management.Automation.Provider.CmdletProvider.WriteError och returnera
nullsedan .Denna metod returnerar antingen den diskinformation som skickats till metoden eller en leverantörsspecifik version av den.
Att koppla dynamiska parametrar till NewDrive
Cmdleten New-PSDrive som stöds av din enhetsleverantör kan kräva ytterligare parametrar. För att koppla dessa dynamiska parametrar till cmdleten implementerar leverantören metoden System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters* . Denna metod returnerar ett objekt som har egenskaper och fält med parsningsattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt .
Denna drivleverantör åsidosätter inte denna metod. Följande kod visar dock standardimplementeringen av denna metod:
Ta bort en enhet
För att stänga databasanslutningen måste enhetsleverantören implementera metoden System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* . Denna metod stänger anslutningen till enheten efter att all leverantörsspecifik information har rensats.
Följande kod visar implementeringen av System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* för denna enhetsleverantör:
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
Om enheten kan tas bort bör metoden returnera informationen som skickas till metoden via parametern drive . Om enheten inte kan tas bort bör metoden skriva ett undantag och sedan returnera null. Om din leverantör inte åsidosätter denna metod, returnerar standardimplementeringen bara den diskinformation som skickats som inmatning.
Initiering av standarddiskar
Din enhetsleverantör implementerar System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* för att montera diskar. Till exempel kan Active Directory-leverantören montera en enhet för standardnamngivningskontexten om datorn är ansluten till en domän.
Denna metod returnerar en samling av diskinformation om de initierade enheterna, eller en tom samling. Anropet till denna metod görs efter att Windows PowerShell-runtime anropar System.Management.Automation.Provider.CmdletProvider.Start*- metoden för att initiera providern.
Denna enhetsleverantör åsidosätter inte System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* -metoden. Följande kod visar dock standardimplementationen, som returnerar en tom samling av diskar:
Saker att komma ihåg när man implementerar InitializeDefaultDrives
Alla enhetsleverantörer bör montera en root-disk för att hjälpa användaren att hitta den. Root-disken kan lista platser som fungerar som roots för andra monterade enheter. Till exempel kan Active Directory-leverantören skapa en enhet som listar namngivningskontexterna som finns i attributen namingContext på roten Distributed System Environment (DSE). Detta hjälper användare att hitta monteringspunkter för andra enheter.
Kodexempel
För komplett exempelkod, se AccessDbProviderSample02 Code Sample.
Testning av Windows PowerShell Drive Provider
När din Windows PowerShell-leverantör har registrerats hos Windows PowerShell kan du testa den genom att köra de stödda cmdletarna på kommandoraden, inklusive eventuella cmdlets som gjorts tillgängliga genom derivation. Låt oss testa leverantören av provdiskar.
Kör cmdleten
Get-PSProviderför att hämta listan över leverantörer och säkerställa att AccessDB-enhetsleverantören är närvarande:PS>
Get-PSProviderFöljande utdata visas:
Name Capabilities Drives ---- ------------ ------ AccessDB None {} Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess {C, Z} Function ShouldProcess {function} Registry ShouldProcess {HKLM, HKCU}Säkerställ att ett databasservernamn (DSN) finns för databasen genom att komma åt datakällorna i operativsystemets administrativa verktyg. I tabellen User DSN , dubbelklicka på MS Access Database och lägg till diskvägen
C:\ps\northwind.mdb.Skapa en ny enhet med exempelenhetsleverantören:
New-PSDrive -Name mydb -Root C:\ps\northwind.mdb -PSProvider AccessDb`Följande utdata visas:
Name Provider Root CurrentLocation ---- -------- ---- --------------- mydb AccessDB C:\ps\northwind.mdbVerifiera anslutningen. Eftersom anslutningen definieras som en medlem av enheten kan du kontrollera den med Get-PDDrive-cmdleten.
Anmärkning
Användaren kan ännu inte interagera med leverantören som en enhet, eftersom leverantören behöver containerfunktionalitet för den interaktionen. För mer information, se Skapa en Windows PowerShell Container Provider.
PS> (Get-PSDrive mydb). Samband
Följande utdata visas:
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 :Ta bort enheten och avsluta skalet:
PS> Remove-PSDrive mydb PS> exit
Se även
Skapa Windows PowerShell-leverantörer