Partager via


Création d’un fournisseur de disques Windows PowerShell

Ce sujet décrit comment créer un fournisseur de disque Windows PowerShell qui offre un moyen d’accéder à un stockage de données via un disque Windows PowerShell. Ce type de fournisseur est également appelé fournisseurs de lecteurs Windows PowerShell. Les disques PowerShell Windows utilisés par le fournisseur permettent de se connecter au stockage de données.

Le fournisseur de disques Windows PowerShell décrit ici donne accès à une base de données Microsoft Access. Pour ce fournisseur, le disque PowerShell de Windows représente la base de données (il est possible d’ajouter n’importe quel nombre de disques à un fournisseur de disque), les conteneurs de premier niveau du disque représentent les tables de la base de données, et les éléments des conteneurs représentent les lignes des tableaux.

Définition de la classe fournisseur Windows PowerShell

Votre fournisseur de disques doit définir une classe .NET dérivant de la classe de base System.Management.Automation.Provider.DriveCmdletProvider . Voici la définition de la classe pour ce fournisseur de disques :

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

Remarquez que dans cet exemple, l’attribut System.Management.Automation.Provider.CmdletProviderAttribute spécifie un nom convivial pour le fournisseur ainsi que les capacités spécifiques à Windows PowerShell que le fournisseur expose à l’exécution Windows PowerShell lors du traitement des commandes. Les valeurs possibles pour les capacités du fournisseur sont définies par l’énumération System.Management.Automation.Provider.ProvidersCapabilities . Ce fournisseur de disques ne prend en charge aucune de ces fonctionnalités.

Définition de la fonctionnalité de base

Comme décrit dans Design Your Windows PowerShell Provider, la classe System.Management.Automation.Provider.DriveCmdletProvider dérive de la classe de base System.Management.Automation.Provider.CmdletProvider qui définit les méthodes nécessaires pour initialiser et déinitialiser le fournisseur. Pour implémenter des fonctionnalités permettant d’ajouter des informations d’initialisation spécifiques à chaque session et de libérer les ressources utilisées par le fournisseur, voir Créer un fournisseur Windows PowerShell de base. Cependant, la plupart des fournisseurs (y compris celui décrit ici) peuvent utiliser l’implémentation par défaut de cette fonctionnalité fournie par Windows PowerShell.

Création d’informations sur l’état du disque

Tous les fournisseurs Windows PowerShell sont considérés comme sans état, ce qui signifie que votre fournisseur de disques doit créer toute information d’état nécessaire à l’exécution Windows PowerShell lorsqu’il appelle votre fournisseur.

Pour ce fournisseur de disque, les informations d’état incluent la connexion à la base de données qui est conservée dans les informations du disque. Voici un code qui montre comment cette information est stockée dans l’objet System.Management.Automation.PSDriveinfo qui décrit le disque :

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

Créer un moteur

Pour permettre à l’exécution PowerShell de Windows de créer un disque, le fournisseur de disques doit implémenter la méthode System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* . Le code suivant montre l’implémentation de la méthode System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* pour ce fournisseur de disques :

      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

Votre dérogation de cette méthode devrait faire ce qui suit :

Attacher des paramètres dynamiques à NewDrive

Le New-PSDrive cmdlet supporté par votre fournisseur de disque peut nécessiter des paramètres supplémentaires. Pour attacher ces paramètres dynamiques au cmdlet, le fournisseur implémente la méthode System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters* . Cette méthode renvoie un objet ayant des propriétés et des champs avec des attributs d’analyse similaires à une classe cmdlet ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary .

Ce fournisseur de disques ne supprime pas cette méthode. Cependant, le code suivant montre l’implémentation par défaut de cette méthode :

Suppression d’un lecteur

Pour fermer la connexion à la base de données, le fournisseur de disques doit implémenter la méthode System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* . Cette méthode ferme la connexion au disque après avoir clarifié toute information spécifique au fournisseur.

Le code suivant montre l’implémentation de la méthode System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* pour ce fournisseur de disques :

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

Si le lecteur peut être retiré, la méthode doit retourner l’information transmise à la méthode via le drive paramètre. Si le disque ne peut pas être supprimé, la méthode doit écrire une exception puis retourner null. Si votre fournisseur ne supprime pas cette méthode, l’implémentation par défaut de cette méthode retourne simplement les informations du disque passées en entrée.

Initialisation des disques par défaut

Votre fournisseur de disques implémente la méthode System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* pour monter les disques. Par exemple, le fournisseur Active Directory peut monter un disque pour le contexte de nommage par défaut si l’ordinateur est joint à un domaine.

Cette méthode renvoie une collection d’informations sur les disques initialisés, ou une collection vide. L’appel à cette méthode se fait après que l’exécution PowerShell de Windows a appelé la méthode System.Management.Automation.Provider.CmdletProvider.Start* pour initialiser le fournisseur.

Ce fournisseur de disques ne supprime pas la méthode System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* . Cependant, le code suivant montre l’implémentation par défaut, qui renvoie une collection de disques vide :

Choses à retenir concernant la mise en œuvre d’InitializeDefaultDrives

Tous les fournisseurs de disques doivent installer un disque racine pour faciliter la découverte de l’utilisateur. Le disque racine peut indiquer des emplacements qui servent de racines pour d’autres disques montés. Par exemple, le fournisseur Active Directory pourrait créer un lecteur listant les contextes de nommage trouvés dans les namingContext attributs de l’environnement système distribué racine (DSE). Cela aide les utilisateurs à trouver des points de montage pour d’autres disques.

Exemple de code

Pour un code d’exemple complet, voir AccessDbProviderSample02 Code Example.

Test du fournisseur de disques Windows PowerShell

Lorsque votre fournisseur Windows PowerShell est enregistré auprès de Windows PowerShell, vous pouvez le tester en exécutant les cmdlets pris en charge en ligne de commande, y compris les cmdlets rendus disponibles par dérivation. Testons le fournisseur de lecteurs d’échantillons.

  1. Exécutez le Get-PSProvider cmdlet pour récupérer la liste des fournisseurs afin de vous assurer que le fournisseur du disque AccessDB est présent :

    PS>Get-PSProvider

    Vous obtenez la sortie suivante :

    Name                 Capabilities                  Drives
    ----                 ------------                  ------
    AccessDB             None                          {}
    Alias                ShouldProcess                 {Alias}
    Environment          ShouldProcess                 {Env}
    FileSystem           Filter, ShouldProcess         {C, Z}
    Function             ShouldProcess                 {function}
    Registry             ShouldProcess                 {HKLM, HKCU}
    
  2. Assurez-vous qu’un nom de serveur de base de données (DSN) existe pour la base de données en accédant à la partie Sources de données des Outils Administratifs du système d’exploitation. Dans la table DSN utilisateur , double-cliquez sur MS Access Database et ajoutez le chemin C:\ps\northwind.mdbdu disque .

  3. Créez un nouveau disque en utilisant le fournisseur de disque d’échantillon :

    New-PSDrive -Name mydb -Root C:\ps\northwind.mdb -PSProvider AccessDb`
    

    Vous obtenez la sortie suivante :

    Name     Provider     Root                   CurrentLocation
    ----     --------     ----                   ---------------
    mydb     AccessDB     C:\ps\northwind.mdb
    
  4. Valider la connexion. Comme la connexion est définie comme un membre du disque, vous pouvez la vérifier en utilisant le cmdlet Get-PDDrive.

    Note

    L’utilisateur ne peut pas encore interagir avec le fournisseur en tant que disque, car le fournisseur a besoin d’une fonctionnalité de conteneur pour cette interaction. Pour plus d’informations, voir Créer un fournisseur de conteneurs Windows PowerShell.

    PS> (Get-PSDrive mydb). Connexion

    Vous obtenez la sortie suivante :

    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. Retirez le lecteur et sortez de la coque :

    PS> Remove-PSDrive mydb
    PS> exit
    

Voir aussi

Création de fournisseurs Windows PowerShell

Concevez votre fournisseur Windows PowerShell

Créer un fournisseur basique de PowerShell Windows