Anteckning
Å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.
Det här avsnittet beskriver hur du skapar en Windows PowerShell-enhetsprovider som ger ett sätt att komma åt ett datalager via en Windows PowerShell-enhet. Den här typen av provider kallas även för Windows PowerShell-enhetsproviders. De Windows PowerShell-enheter som används av providern ger möjlighet att ansluta till datalagret.
Windows PowerShell-enhetsprovidern som beskrivs här ger åtkomst till en Microsoft Access-databas. För den här providern representerar Windows PowerShell-enheten databasen (det går att lägga till valfritt antal enheter till en enhetsprovider), de översta containrarna på enheten representerar tabellerna i databasen och containrarnas objekt representerar raderna i tabellerna.
Definiera Windows PowerShell-providerklassen
Enhetsprovidern måste definiera en .NET-klass som härleds från basklassen System.Management.Automation.Provider.DriveCmdletProv ider. Här är klassdefinitionen för den här enhetsprovidern:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
Observera att attributet System.Management.Automation.Provider.CmdletProviderAttribute i det här exemplet anger ett användarvänligt namn för providern och de Windows PowerShell-specifika funktioner som providern exponerar för Windows PowerShell-körningen under kommandobearbetningen. Möjliga värden för providerfunktionerna definieras av System.Management.Automation.Provider.ProviderCapabilities uppräkning. Den här enhetsprovidern stöder inte någon av dessa funktioner.
Definiera basfunktioner
Enligt beskrivningen i Designa din Windows PowerShell-providerhärleds klassen System.Management.Automation.Provider.DriveCmdletProvider från klassen System.Management.Automation.Provider.CmdletProvider basklass som definierar de metoder som behövs för att initiera och inte initiera providern. Information om hur du implementerar funktioner för att lägga till sessionsspecifik initieringsinformation och för att frigöra resurser som används av providern finns i Skapa en grundläggande Windows PowerShell-provider. De flesta leverantörer (inklusive providern som beskrivs här) kan dock använda standardimplementeringen av den här funktionen som tillhandahålls av Windows PowerShell.
Skapa information om enhetstillstånd
Alla Windows PowerShell-leverantörer anses vara tillståndslösa, vilket innebär att enhetsprovidern behöver skapa tillståndsinformation som behövs av Windows PowerShell-körningen när den anropar din leverantör.
För den här enhetsprovidern innehåller tillståndsinformationen anslutningen till databasen som sparas som en del av enhetsinformationen. Här är kod som visar hur den här informationen 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 windows PowerShell-körningen ska kunna skapa en enhet måste enhetsprovidern implementera metoden System.Management.Automation.Provider.DriveCmdletProvider.NewDrive*. Följande kod visar implementeringen av System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* metod för den här enhetsprovidern:
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
Åsidosättningen av den här metoden bör göra följande:
Kontrollera att System.Management.Automation.PSDriveinfo.Root* medlem finns och att en anslutning till datalagret kan göras.
Skapa en enhet och fyll i anslutningsmedlemmen till stöd för cmdleten
New-PSDrive.Verifiera objektet System.Management.Automation.PSDriveinfo för den föreslagna enheten.
Ändra objektet System.Management.Automation.PSDriveinfo som beskriver enheten med nödvändig information om prestanda eller tillförlitlighet, eller ange extra data för anropare som använder enheten.
Hantera fel med hjälp av metoden System.Management.Automation.Provider.CmdletProvider.WriteError och returnera sedan
null.Den här metoden returnerar antingen enhetsinformationen som skickades till metoden eller en providerspecifik version av den.
Koppla dynamiska parametrar till NewDrive
Den New-PSDrive cmdlet som stöds av enhetsprovidern kan kräva ytterligare parametrar. Om du vill koppla dessa dynamiska parametrar till cmdleten implementerar providern metoden System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters*. Den här metoden returnerar ett objekt som har egenskaper och fält med parsningsattribut som liknar en cmdlet-klass eller en System.Management.Automation.RuntimeDefinedParameterDictionary-objekt.
Den här enhetsprovidern åsidosätter inte den här metoden. Följande kod visar dock standardimplementeringen av den här metoden:
Ta bort en enhet
För att stänga databasanslutningen måste enhetsprovidern implementera metoden System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive*. Den här metoden stänger anslutningen till enheten efter att all providerspecifik information har rensats.
Följande kod visar implementeringen av System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* metod för den här enhetsprovidern:
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 ska metoden returnera den information som skickas till metoden via parametern drive. Om enheten inte kan tas bort ska metoden skriva ett undantag och sedan returnera null. Om providern inte åsidosätter den här metoden returnerar standardimplementeringen av den här metoden bara enhetsinformationen som skickas som indata.
Initiera standardenheter
Enhetsprovidern implementerar System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* metod för att montera enheter. Active Directory-providern kan till exempel montera en enhet för standardnamngivningskontexten om datorn är ansluten till en domän.
Den här metoden returnerar en samling enhetsinformation om de initierade enheterna eller en tom samling. Anropet till den här metoden görs efter att Windows PowerShell-körningen anropar metoden System.Management.Automation.Provider.CmdletProvider.Start* för att initiera providern.
Den här enhetsprovidern åsidosätter inte metoden System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives*. Följande kod visar dock standardimplementeringen, som returnerar en tom enhetssamling:
Saker att komma ihåg när du implementerar InitializeDefaultDrives
Alla enhetsprovidrar bör montera en rotenhet för att hjälpa användaren med identifiering. Rotenheten kan lista platser som fungerar som rötter för andra monterade enheter. Active Directory-providern kan till exempel skapa en enhet som visar de namngivningskontexter som finns i namingContext-attributen i roten DSE (Distributed System Environment). Detta hjälper användarna att identifiera monteringspunkter för andra enheter.
Kodexempel
Fullständig exempelkod finns i AccessDbProviderSample02 Code Sample.
Testa Windows PowerShell-enhetsprovidern
När din Windows PowerShell-provider har registrerats med Windows PowerShell kan du testa den genom att köra de cmdletar som stöds på kommandoraden, inklusive eventuella cmdletar som görs tillgängliga genom härledning. Nu ska vi testa exempelenhetsprovidern.
Kör cmdleten
Get-PSProviderför att hämta listan över leverantörer för att säkerställa att AccessDB-enhetsprovidern finns: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}Kontrollera att det finns ett databasservernamn (DSN) för databasen genom att komma åt datakällor del av Administrationsverktyg för operativsystemet. I tabellen User DSN dubbelklickar du på MS Access Database och lägger till enhetssökvägen
C:\ps\northwind.mdb.Skapa en ny enhet med hjälp av exempelenhetsprovidern:
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 medlem i enheten kan du kontrollera den med hjälp av cmdleten Get-PDDrive.
Anmärkning
Användaren kan ännu inte interagera med providern som en enhet, eftersom providern behöver containerfunktioner för den interaktionen. Mer information finns i Skapa en Windows PowerShell-containerprovider.
PS> (Get-PSDrive mydb). Anslutning
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 gränssnittet:
PS> Remove-PSDrive mydb PS> exit
Se även
Skapa Windows PowerShell-providers