Skapa en Windows PowerShell-enhetsprovider
Det här avsnittet beskriver hur du skapar en Windows PowerShell-enhetsprovider som ger ett sätt att komma åt ett datalager via 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.
Enhetsprovidern Windows PowerShell 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 ett val annat antal enheter till en enhetsprovider), containrarna på den översta nivån på enheten representerar tabellerna i databasen och objekten i containrarna representerar raderna i tabellerna.
Definiera Windows PowerShell providerklass
Enhetsprovidern måste definiera en .NET-klass som härleds från basklassen System.Management.Automation.Provider.Drivecmdletprovider. Här är klassdefinitionen för den här enhetsprovidern:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
Observera att i det här exemplet anger attributet System.Management.Automation.Provider.Cmdletproviderattribute 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 uppräkningen System.Management.Automation.Provider.Providercapabilities. Den här enhetsprovidern stöder inte någon av dessa funktioner.
Definiera grundläggande funktioner
Enligt beskrivningen i Designa din Windows PowerShell-providerhärleds klassen System.Management.Automation.Provider.Drivecmdletprovider från basklassen System.Management.Automation.Provider.Cmdletprovider som definierar de metoder som behövs för att initiera och oinitiera providern. Information om hur du implementerar funktioner för att lägga till sessionsspecifik initieringsinformation och 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 standardimplementering av den här funktionen som tillhandahålls av Windows PowerShell.
Skapa information om enhetstillstånd
Alla Windows PowerShell providers betraktas som tillståndslösa, vilket innebär att enhetsprovidern måste skapa eventuell tillståndsinformation som krä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öra en enhet måste enhetsprovidern implementera metoden System.Management.Automation.Provider.Drivecmdletprovider.Newdrive*. Följande kod visar implementeringen av metoden System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* 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 medlemmen System.Management.Automation.PSDriveinfo.Root* finns och att det går att upprätta en anslutning till datalagret.
Skapa en enhet och fyll i anslutningsmedlemmen som stöd för
New-PSDrive
cmdleten .Validera 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 den enhetsinformation som skickades till metoden eller en providerspecifik version av den.
Koppla dynamiska parametrar till NewDrive
New-PSDrive
Cmdleten som stöds av enhetsprovidern kan kräva ytterligare parametrar. För att 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 ett System.Management.Automation.Runtimedefinedparameterdictionary-objekt.
Den här enhetsprovidern åsidosätter inte den här metoden. Följande kod visar dock standardimplementering av den här metoden:
Ta bort en enhet
Om du vill stänga databasanslutningen måste enhetsprovidern implementera metoden System.Management.Automation.Provider.Drivecmdletprovider.Removedrive*. Den här metoden stänger anslutningen till enheten efter rensning av providerspecifik information.
Följande kod visar implementeringen av metoden System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* 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 drive
parametern . Om enheten inte kan tas bort ska metoden skriva ett undantag och sedan returnera null
. Om leverantören inte åsidosätter den här metoden returnerar standardimplementering av den här metoden bara enhetsinformation som skickas som indata.
Initiera standardenheter
Enhetsprovidern implementerar metoden System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives* 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 när Windows PowerShell runtime 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 standardimplementering, som returnerar en tom enhetssamling:
Saker att komma ihåg om att implementera InitializeDefaultDrives
Alla enhetsproviders bör montera en rotenhet för att hjälpa användaren att identifiera. 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 en lista över namngivningskontexterna som finns i attributen i namingContext
DSE (Root 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 cmdlets som stöds på kommandoraden, inklusive eventuella cmdlets som gjorts tillgängliga av frånkoppling. Vi testar provkörningsprovidern.
Kör
Get-PSProvider
cmdleten för att hämta listan över providers för att säkerställa att AccessDB-enhetsprovidern finns:PS->
Get-PSProvider
Fö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 öppna datakällorna i Administrationsverktyg för operativsystemet. I tabellen Användar-DSN dubbelklickar du på MS Access Database och lägger till enhetssökvägen
C:\ps\northwind.mdb
.Skapa en ny enhet med 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.mdb
Verifiera anslutningen. Eftersom anslutningen definieras som medlem i enheten kan du kontrollera den med hjälp av Get-PDDrive cmdlet.
Anteckning
Användaren kan ännu inte interagera med providern som en enhet eftersom providern behöver containerfunktioner för interaktionen. Mer information finns i Skapa en Windows PowerShell containerprovider.
PS> (get-psdrive mydb).connection
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
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för