Creazione di un provider di unità di Windows PowerShellCreating a Windows PowerShell Drive Provider

Questo argomento descrive come creare un provider di unità di Windows PowerShell che fornisce un modo per accedere a un archivio dati tramite un'unità di Windows PowerShell.This topic describes how to create a Windows PowerShell drive provider that provides a way to access a data store through a Windows PowerShell drive. Questo tipo di provider è anche noto come provider di unità di Windows PowerShell.This type of provider is also referred to as Windows PowerShell drive providers. Le unità di Windows PowerShell utilizzate dal provider forniscono i mezzi per connettersi all'archivio dati.The Windows PowerShell drives used by the provider provide the means to connect to the data store.

Il provider di unità di Windows PowerShell descritto di seguito consente di accedere a un database di Microsoft Access.The Windows PowerShell drive provider described here provides access to a Microsoft Access database. Per questo provider, l'unità di Windows PowerShell rappresenta il database (è possibile aggiungere un numero qualsiasi di unità a un provider di unità), i contenitori di livello superiore dell'unità rappresentano le tabelle nel database e gli elementi dei contenitori rappresentano le righe nelle tabelle.For this provider, the Windows PowerShell drive represents the database (it is possible to add any number of drives to a drive provider), the top-level containers of the drive represent the tables in the database, and the items of the containers represent the rows in the tables.

Definizione della classe del provider di Windows PowerShellDefining the Windows PowerShell Provider Class

Il provider di unità deve definire una classe .NET che deriva dalla classe di base System. Management. Automation. provider. Drivecmdletprovider .Your drive provider must define a .NET class that derives from the System.Management.Automation.Provider.Drivecmdletprovider base class. Di seguito è illustrata la definizione di classe per questo provider di unità:Here is the class definition for this drive provider:

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider

Si noti che in questo esempio l'attributo System. Management. Automation. provider. CmdletProviderAttribute specifica un nome descrittivo per il provider e le funzionalità specifiche di Windows PowerShell che il provider espone al runtime di Windows PowerShell durante l'elaborazione del comando.Notice that in this example, the System.Management.Automation.Provider.Cmdletproviderattribute attribute specifies a user-friendly name for the provider and the Windows PowerShell specific capabilities that the provider exposes to the Windows PowerShell runtime during command processing. I valori possibili per le funzionalità del provider sono definiti dall'enumerazione System. Management. Automation. provider. ProviderCapabilities .The possible values for the provider capabilities are defined by the System.Management.Automation.Provider.Providercapabilities enumeration. Questo provider di unità non supporta nessuna di queste funzionalità.This drive provider does not support any of these capabilities.

Definizione della funzionalità di baseDefining Base Functionality

Come descritto nella pagina relativa alla progettazione del provider di Windows PowerShell, la classe System. Management. Automation. provider. Drivecmdletprovider deriva dalla classe di base System. Management. Automation. provider. CmdletProvider che definisce i metodi necessari per l'inizializzazione e l'annullamento dell'inizializzazione del provider.As described in Design Your Windows PowerShell Provider, the System.Management.Automation.Provider.Drivecmdletprovider class derives from the System.Management.Automation.Provider.Cmdletprovider base class that defines the methods needed for initializing and uninitializing the provider. Per implementare la funzionalità per l'aggiunta di informazioni di inizializzazione specifiche della sessione e per il rilascio di risorse utilizzate dal provider, vedere creazione di un provider di Windows PowerShell di base.To implement functionality for adding session-specific initialization information and for releasing resources that are used by the provider, see Creating a Basic Windows PowerShell Provider. Tuttavia, la maggior parte dei provider (incluso il provider descritto qui) può usare l'implementazione predefinita di questa funzionalità fornita da Windows PowerShell.However, most providers (including the provider described here) can use the default implementation of this functionality that is provided by Windows PowerShell.

Creazione di informazioni sullo stato dell'unitàCreating Drive State Information

Tutti i provider di Windows PowerShell sono considerati senza stato, il che significa che il provider di unità deve creare tutte le informazioni sullo stato necessarie al runtime di Windows PowerShell quando chiama il provider.All Windows PowerShell providers are considered stateless, which means that your drive provider needs to create any state information that is needed by the Windows PowerShell runtime when it calls your provider.

Per questo provider di unità, le informazioni sullo stato includono la connessione al database mantenuto come parte delle informazioni sull'unità.For this drive provider, state information includes the connection to the database that is kept as part of the drive information. Ecco il codice che mostra in che modo queste informazioni vengono archiviate nel System.Management.Automation.PSDoggetto riveinfo che descrive l'unità:Here is code that shows how this information is stored in the System.Management.Automation.PSDriveinfo object that describes the drive:

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

Creazione di un'unitàCreating a Drive

Per consentire al runtime di Windows PowerShell di creare un'unità, il provider di unità deve implementare il metodo System. Management. Automation. provider. Drivecmdletprovider. nuovaunità * .To allow the Windows PowerShell runtime to create a drive, the drive provider must implement the System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* method. Il codice seguente illustra l'implementazione del metodo System. Management. Automation. provider. Drivecmdletprovider. nuovaunità * per questo provider di unità:The following code shows the implementation of the System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* method for this drive provider:

      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

L'override di questo metodo deve eseguire le operazioni seguenti:Your override of this method should do the following:

Associazione di parametri dinamici a nuovaunitàAttaching Dynamic Parameters to NewDrive

Il New-PSDrive cmdlet supportato dal provider di unità potrebbe richiedere parametri aggiuntivi.The New-PSDrive cmdlet supported by your drive provider might require additional parameters. Per alleghi questi parametri dinamici al cmdlet, il provider implementa il metodo System. Management. Automation. provider. Drivecmdletprovider. Newdrivedynamicparameters * .To attach these dynamic parameters to the cmdlet, the provider implements the System.Management.Automation.Provider.Drivecmdletprovider.Newdrivedynamicparameters* method. Questo metodo restituisce un oggetto con proprietà e campi con attributi di analisi simili a una classe di cmdlet o a un oggetto System. Management. Automation. RuntimeDefinedParameterDictionary .This method returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object.

Questo provider di unità non esegue l'override di questo metodo.This drive provider does not override this method. Tuttavia, nel codice seguente viene illustrata l'implementazione predefinita di questo metodo:However, the following code shows the default implementation of this method:

Rimozione di un'unitàRemoving a Drive

Per chiudere la connessione al database, il provider di unità deve implementare il metodo System. Management. Automation. provider. Drivecmdletprovider. Removedrive * .To close the database connection, the drive provider must implement the System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* method. Questo metodo chiude la connessione all'unità dopo avere pulito le informazioni specifiche del provider.This method closes the connection to the drive after cleaning up any provider-specific information.

Il codice seguente illustra l'implementazione del metodo System. Management. Automation. provider. Drivecmdletprovider. Removedrive * per questo provider di unità:The following code shows the implementation of the System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* method for this drive provider:

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 è possibile rimuovere l'unità, il metodo deve restituire le informazioni passate al metodo tramite il drive parametro.If the drive can be removed, the method should return the information passed to the method through the drive parameter. Se non è possibile rimuovere l'unità, il metodo deve scrivere un'eccezione e quindi restituire null .If the drive cannot be removed, the method should write an exception and then return null. Se il provider non esegue l'override di questo metodo, l'implementazione predefinita di questo metodo restituisce solo le informazioni sull'unità passate come input.If your provider does not override this method, the default implementation of this method just returns the drive information passed as input.

Inizializzazione di unità predefiniteInitializing Default Drives

Il provider di unità implementa il metodo System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives * per montare le unità.Your drive provider implements the System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives* method to mount drives. Il provider di Active Directory, ad esempio, può montare un'unità per il contesto dei nomi predefinito se il computer è aggiunto a un dominio.For example, the Active Directory provider might mount a drive for the default naming context if the computer is joined to a domain.

Questo metodo restituisce una raccolta di informazioni sulle unità inizializzate o una raccolta vuota.This method returns a collection of drive information about the initialized drives, or an empty collection. La chiamata a questo metodo viene eseguita dopo che il runtime di Windows PowerShell chiama il metodo System. Management. Automation. provider. CmdletProvider. Start * per inizializzare il provider.The call to this method is made after the Windows PowerShell runtime calls the System.Management.Automation.Provider.Cmdletprovider.Start* method to initialize the provider.

Questo provider di unità non esegue l'override del metodo System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives * .This drive provider does not override the System.Management.Automation.Provider.Drivecmdletprovider.Initializedefaultdrives* method. Tuttavia, nel codice seguente viene illustrata l'implementazione predefinita, che restituisce una raccolta di unità vuota:However, the following code shows the default implementation, which returns an empty drive collection:

Aspetti da ricordare sull'implementazione di InitializeDefaultDrivesThings to Remember About Implementing InitializeDefaultDrives

Tutti i provider di unità devono montare un'unità radice per aiutare l'utente a individuarlo.All drive providers should mount a root drive to help the user with discoverability. L'unità radice potrebbe elencare le posizioni che funge da radice per altre unità montate.The root drive might list locations that serve as roots for other mounted drives. Ad esempio, il provider Active Directory potrebbe creare un'unità in cui sono elencati i contesti di denominazione trovati negli namingContext attributi nell'ambiente di sistema distribuito radice (DSE).For example, the Active Directory provider might create a drive that lists the naming contexts found in the namingContext attributes on the root Distributed System Environment (DSE). Ciò consente agli utenti di individuare i punti di montaggio per altre unità.This helps users discover mount points for other drives.

Codice di esempioCode Sample

Per il codice di esempio completo, vedere esempio di codice AccessDbProviderSample02.For complete sample code, see AccessDbProviderSample02 Code Sample.

Test del provider di unità di Windows PowerShellTesting the Windows PowerShell Drive Provider

Quando il provider di Windows PowerShell è stato registrato con Windows PowerShell, è possibile testarlo eseguendo i cmdlet supportati dalla riga di comando, inclusi tutti i cmdlet resi disponibili dalla derivazione.When your Windows PowerShell provider has been registered with Windows PowerShell, you can test it by running the supported cmdlets on the command line, including any cmdlets made available by derivation. Testiamo il provider di unità di esempio.Let's test the sample drive provider.

  1. Eseguire il Get-PSProvider cmdlet per recuperare l'elenco dei provider per verificare che sia presente il provider dell'unità accessdb:Run the Get-PSProvider cmdlet to retrieve the list of providers to ensure that the AccessDB drive provider is present:

    > PS Get-PSProviderPS> Get-PSProvider

    Viene visualizzato l'output seguente:The following output appears:

    Name                 Capabilities                  Drives
    ----                 ------------                  ------
    AccessDB             None                          {}
    Alias                ShouldProcess                 {Alias}
    Environment          ShouldProcess                 {Env}
    FileSystem           Filter, ShouldProcess         {C, Z}
    Function             ShouldProcess                 {function}
    Registry             ShouldProcess                 {HKLM, HKCU}
    
  2. Assicurarsi che esista un nome del server di database (DSN) per il database accedendo alla parte origini dati degli strumenti di amministrazione per il sistema operativo.Ensure that a database server name (DSN) exists for the database by accessing the Data Sources portion of the Administrative Tools for the operating system. Nella tabella DSN utente fare doppio clic su database di MS Access e aggiungere il percorso dell'unità C:\ps\northwind.mdb .In the User DSN table, double-click MS Access Database and add the drive path C:\ps\northwind.mdb.

  3. Creare una nuova unità utilizzando il provider di unità di esempio:Create a new drive using the sample drive provider:

    new-psdrive -name mydb -root c:\ps\northwind.mdb -psprovider AccessDb`
    

    Viene visualizzato l'output seguente:The following output appears:

    Name     Provider     Root                   CurrentLocation
    ----     --------     ----                   ---------------
    mydb     AccessDB     c:\ps\northwind.mdb
    
  4. Convalidare la connessione.Validate the connection. Poiché la connessione è definita come membro dell'unità, è possibile verificarla utilizzando il cmdlet Get-PDDrive.Because the connection is defined as a member of the drive, you can check it using the Get-PDDrive cmdlet.

    Nota

    L'utente non può ancora interagire con il provider come unità, perché il provider richiede la funzionalità del contenitore per tale interazione.The user cannot yet interact with the provider as a drive, as the provider needs container functionality for that interaction. Per ulteriori informazioni, vedere creazione di un provider di contenitori di Windows PowerShell.For more information, see Creating a Windows PowerShell Container Provider.

    PS> (Get-PSDrive MyDB). ConnectionPS> (get-psdrive mydb).connection

    Viene visualizzato l'output seguente:The following output appears:

    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. Rimuovere l'unità e uscire dalla shell:Remove the drive and exit the shell:

    PS> remove-psdrive mydb
    PS> exit
    

Vedere ancheSee Also

Creazione di provider di Windows PowerShellCreating Windows PowerShell Providers

Progettare il provider di Windows PowerShellDesign Your Windows PowerShell Provider

Creazione di un provider di Windows PowerShell di baseCreating a Basic Windows PowerShell Provider