Condividi tramite


Creazione di un provider di unità PowerShell per Windows

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:

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.

  1. Esegui il Get-PSProvider cmdlet per recuperare l'elenco dei provider e assicurarti che il provider del disco AccessDB sia presente:

    PS>Get-PSProvider

    Viene 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}
    
  2. 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 .

  3. 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.mdb
    
  4. Convalidare 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         :
    
  5. Rimuovi il disco ed esci dal gusto:

    PS> Remove-PSDrive mydb
    PS> exit
    

Vedere anche

Creazione di provider PowerShell per Windows

Progetta il tuo provider PowerShell per Windows

Creare un provider base di PowerShell per Windows