Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo argomento descrive come creare un provider di unità PowerShell per Windows che offra un modo per accedere a uno store dati tramite un'unità PowerShell di Windows. Questo tipo di provider è anche chiamato provider di unità PowerShell di Windows. I dischi PowerShell di Windows utilizzati dal fornitore forniscono il mezzo per connettersi allo store dati.
Il provider di unità PowerShell per Windows descritto qui fornisce accesso a un database Microsoft Access. Per questo provider, il disco PowerShell di Windows rappresenta il database (è possibile aggiungere qualsiasi numero di dischi a un provider di dischi), i contenitori di livello superiore del disco rappresentano le tabelle nel database e gli elementi dei contenitori rappresentano le righe nelle tabelle.
Definizione della classe provider PowerShell di Windows
Il tuo provider di unità deve definire una classe .NET che derivi dalla classe base System.Management.Automation.Provider.DriveCmdletProvider . Ecco la definizione di classe per questo fornitore di dischi:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
Nota che in questo esempio, l'attributo System.Management.Automation.Provider.CmdletProviderAttribute specifica un nome user-friendly per il provider e le funzionalità specifiche di Windows PowerShell che il provider espone al runtime di Windows PowerShell durante l'elaborazione dei comandi. I valori possibili per le capacità del provider sono definiti dall'enumerazione System.Management.Automation.Provider.ProviderCapabilities . Questo provider di unità non supporta nessuna di queste capacità.
Definizione della funzionalità di base
Come descritto in Design Your Windows PowerShell Provider, la classe System.Management.Automation.Provider.DriveCmdletProvider deriva dalla classe base System.Management.Automation.Provider.CmdletProvider che definisce i metodi necessari per inizializzare e disinizializzare il provider. Per implementare funzionalità per aggiungere informazioni di inizializzazione specifiche per sessione e per rilasciare risorse utilizzate dal provider, vedi Creare un provider base di PowerShell per Windows. Tuttavia, la maggior parte dei provider (incluso quello descritto qui) può utilizzare l'implementazione predefinita di questa funzionalità fornita da Windows PowerShell.
Creazione di informazioni sullo stato del disco
Tutti i provider PowerShell di Windows sono considerati senza stato, il che significa che il tuo provider di dischi deve creare tutte le informazioni di stato necessarie al runtime di Windows PowerShell quando chiama il tuo provider.
Per questo fornitore di dischi, le informazioni di stato includono la connessione al database che viene conservata come parte delle informazioni del disco. Ecco un codice che mostra come queste informazioni vengono memorizzate nell'oggetto System.Management.Automation.PSDriveinfo che descrive il disco:
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
Creare una spinta
Per permettere al runtime PowerShell di Windows di creare un disco, il provider deve implementare il metodo System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* . Il seguente codice mostra l'implementazione del metodo System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* per questo provider di unità:
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
Il tuo sovrascritto di questo metodo dovrebbe fare quanto segue:
Verifica che il membro System.Management.Automation.PSDriveinfo.Root* esista e che sia possibile creare una connessione con lo store dati.
Crea un disco e popola il membro della connessione, a supporto del
New-PSDrivecmdlet.Valida l'oggetto System.Management.Automation.PSDriveinfo per il disco proposto.
Modifica l'oggetto System.Management.Automation.PSDriveinfo che descrive il disco con qualsiasi informazione richiesto sulle prestazioni o affidabilidade, oppure fornisci dati extra ai chiamanti che utilizzano il disco.
Gestire i fallimenti utilizzando il metodo System.Management.Automation.Provider.CmdletProvider.WriteError e poi restituire
null.Questo metodo restituisce o le informazioni del disco che sono state passate al metodo o una versione specifica per il fornitore.
Attacco dei parametri dinamici a NewDrive
Il New-PSDrive cmdlet supportato dal tuo provider di dischi potrebbe richiedere parametri aggiuntivi. Per aggiungere questi parametri dinamici al cmdlet, il provider implementa il metodo System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters* . Questo metodo restituisce un oggetto che possiede proprietà e campi con attributi di analisi analoghe a una classe cmdlet o a un oggetto System.Management.Automation.RuntimeDefinedParameterDictionary .
Questo fornitore di unità non sovrascrive questo metodo. Tuttavia, il seguente codice mostra l'implementazione predefinita di questo metodo:
Rimozione di un disco
Per chiudere la connessione al database, il provider del disco deve implementare il metodo System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* . Questo metodo chiude la connessione al disco dopo aver ripulito eventuali informazioni specifiche del fornitore.
Il seguente codice mostra l'implementazione del metodo System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* per questo provider di dischi:
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
Se il disco può essere rimosso, il metodo dovrebbe restituire le informazioni passate al metodo tramite il drive parametro. Se il disco non può essere rimosso, il metodo dovrebbe scrivere un'eccezione e poi restituire null. Se il tuo provider non sovrascrive questo metodo, l'implementazione predefinita di questo metodo restituisce semplicemente le informazioni del disco passate come input.
Inizializzazione dei dischi predefiniti
Il tuo provider di dischi implementa il metodo System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* per montare i dischi. Ad esempio, il provider Active Directory potrebbe montare un'unità per il contesto di denominazione predefinito se il computer è collegato a un dominio.
Questo metodo restituisce una raccolta di informazioni sui dischi inizializzati, oppure una collezione vuota. La chiamata a questo metodo avviene dopo che il runtime PowerShell di Windows chiama il metodo System.Management.Automation.Provider.CmdletProvider.Start* per inizializzare il provider.
Questo provider di unità non sovrascrive il metodo System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* . Tuttavia, il seguente codice mostra l'implementazione predefinita, che restituisce una collezione di dischi vuoti:
Cose da ricordare sull'implementazione degli InitializeDefaultDrives
Tutti i provider di dischi dovrebbero montare un disco root per aiutare l'utente a trovare la scoperta. Il disco radice potrebbe elencare posizioni che fungono da radici per altri dischi montati. Ad esempio, il provider di Active Directory potrebbe creare un'unità che elenchi i contesti di denominazione presenti negli namingContext attributi dell'Ambiente di Sistema Distribuito (DSE) radice. Questo aiuta gli utenti a scoprire punti di montaggio per altri dischi.
Codice di esempio
Per il codice di esempio completo, vedi AccessDbProviderSample02 Code Sample.
Testare il provider di unità PowerShell di Windows
Quando il tuo provider PowerShell di Windows è stato registrato con Windows PowerShell, puoi testarlo eseguendo i cmdlet supportati sulla riga di comando, inclusi eventuali cmdlet resi disponibili tramite derivazione. Testiamo il fornitore del campione drive.
Esegui il
Get-PSProvidercmdlet per recuperare l'elenco dei provider e assicurarti che il provider del disco AccessDB sia presente:PS>
Get-PSProviderViene visualizzato l'output seguente:
Name Capabilities Drives ---- ------------ ------ AccessDB None {} Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess {C, Z} Function ShouldProcess {function} Registry ShouldProcess {HKLM, HKCU}Assicurati che esista un nome server di database (DSN) per il database accedendo alla parte Fonti Dati degli Strumenti Amministrativi del sistema operativo. Nella tabella User DSN , clicca due volte su MS Access Database e aggiungi il percorso
C:\ps\northwind.mdbdel disco .Crea un nuovo disco utilizzando il provider del campione:
New-PSDrive -Name mydb -Root C:\ps\northwind.mdb -PSProvider AccessDb`Viene visualizzato l'output seguente:
Name Provider Root CurrentLocation ---- -------- ---- --------------- mydb AccessDB C:\ps\northwind.mdbConvalidare la connessione. Poiché la connessione è definita come un membro del disco, puoi verificarla usando il cmdlet Get-PDDrive.
Annotazioni
L'utente non può ancora interagire con il provider come un'unità, poiché il provider ha bisogno di funzionalità container per quell'interazione. Per maggiori informazioni, vedi Creare un fornitore di container Windows PowerShell.
PS> (Get-PSDrive mydb). Connessione
Viene visualizzato l'output seguente:
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 :Rimuovi il disco ed esci dal gusto:
PS> Remove-PSDrive mydb PS> exit
Vedere anche
Creazione di provider PowerShell per Windows