Partager via


Démarrage rapide du fournisseur Windows PowerShell

Cette rubrique explique comment créer un fournisseur Windows PowerShell qui dispose de fonctionnalités de base pour créer un lecteur. Pour obtenir des informations générales sur les fournisseurs, consultez Vue d’ensemble du fournisseur Windows PowerShell. Pour obtenir des exemples de fournisseurs avec des fonctionnalités plus complètes, consultez Exemples de fournisseurs.

Écriture d’un fournisseur de base

La fonctionnalité la plus simple d’un fournisseur Windows PowerShell consiste à créer et supprimer des lecteurs. Dans cet exemple, nous implémentons les System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* et System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* méthodes de la classe System.Management.Automation.Provider.DriveCmdletProvider. Vous verrez également comment déclarer une classe de fournisseur.

Lorsque vous écrivez un fournisseur, vous pouvez spécifier les lecteurs par défaut créés automatiquement lorsque le fournisseur est disponible. Vous définissez également une méthode pour créer des lecteurs qui utilisent ce fournisseur.

Les exemples fournis dans cette rubrique sont basés sur l’exemple AccessDBProviderSample02, qui fait partie d’un exemple plus large qui représente une base de données Access en tant que lecteur Windows PowerShell.

Configuration du projet

Dans Visual Studio, créez un projet de bibliothèque de classes nommé AccessDBProviderSample. Effectuez les étapes suivantes pour configurer votre projet afin que Windows PowerShell démarre, et que le fournisseur soit chargé dans la session, lorsque vous générez et démarrez votre projet.

Configurer le projet de fournisseur
  1. Ajoutez l’assembly System.Management.Automation comme référence à votre projet.

  2. Cliquez sur project > AccessDBProviderSample Properties > Debug. Dans Démarrer le projet, cliquez sur Démarrer le programme externe, puis accédez à l’exécutable Windows PowerShell (généralement C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe).

  3. Sous options de démarrage, entrez les éléments suivants dans la zone arguments de ligne de commande : -NoExit -Command "[Reflection.Assembly]::LoadFrom(AccessDBProviderSample.dll' ) | Import-Module"

Déclaration de la classe de fournisseur

Notre fournisseur dérive de la classe System.Management.Automation.Provider.DriveCmdletProvider. La plupart des fournisseurs qui fournissent des fonctionnalités réelles (accès et manipulation d’éléments, navigation dans le magasin de données et obtention et définition de contenu d’éléments) dérivent de la classe System.Management.Automation.Provider.NavigationCmdletProvider.

En plus de spécifier que la classe dérive de System.Management.Automation.Provider.DriveCmdletProvider, vous devez la décorer avec le System.Management.Automation.Provider.CmdletProviderAttribute comme illustré dans l’exemple.

namespace Microsoft.Samples.PowerShell.Providers
{
  using System;
  using System.Data;
  using System.Data.Odbc;
  using System.IO;
  using System.Management.Automation;
  using System.Management.Automation.Provider;

  #region AccessDBProvider

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

}
}

Implémentation de NewDrive

La méthode System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* est appelée par le moteur Windows PowerShell lorsqu’un utilisateur appelle l’applet de commande Microsoft.PowerShell.Commands.NewPSDriveCommand en spécifiant le nom de votre fournisseur. Le paramètre PSDriveInfo est transmis par le moteur Windows PowerShell et la méthode retourne le nouveau lecteur au moteur Windows PowerShell. Cette méthode doit être déclarée dans la classe créée ci-dessus.

La méthode vérifie d’abord que l’objet lecteur et la racine du lecteur qui ont été passés existent, en retournant null si l’un d’eux n’est pas l’un d’eux. Il utilise ensuite un constructeur de la classe interne AccessDBPSDriveInfo pour créer un lecteur et une connexion à la base de données Access que représente le lecteur.

protected override PSDriveInfo NewDrive(PSDriveInfo drive)
    {
      // Check if the drive object is null.
      if (drive == null)
      {
        WriteError(new ErrorRecord(
                   new ArgumentNullException("drive"),
                   "NullDrive",
                   ErrorCategory.InvalidArgument,
                   null));

        return null;
      }

      // Check if the drive root is not null or empty
      // and if it is 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;
    }

Voici la classe interne AccessDBPSDriveInfo qui inclut le constructeur utilisé pour créer un lecteur et contient les informations d’état du lecteur.

internal class AccessDBPSDriveInfo : PSDriveInfo
  {
    /// <summary>
    /// A reference to the connection to the database.
    /// </summary>
    private OdbcConnection connection;

    /// <summary>
    /// Initializes a new instance of the AccessDBPSDriveInfo class.
    /// The constructor takes a single argument.
    /// </summary>
    /// <param name="driveInfo">Drive defined by this provider</param>
    public AccessDBPSDriveInfo(PSDriveInfo driveInfo)
           : base(driveInfo)
    {
    }

    /// <summary>
    /// Gets or sets the ODBC connection information.
    /// </summary>
    public OdbcConnection Connection
    {
        get { return this.connection; }
        set { this.connection = value; }
    }
  }

Implémentation de RemoveDrive

La méthode System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* est appelée par le moteur Windows PowerShell lorsqu’un utilisateur appelle l’applet de commande Microsoft.PowerShell.Commands.RemovePSDriveCommand. La méthode de ce fournisseur ferme la connexion à la base de données Access.

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 the ODBC connection to the drive.
      AccessDBPSDriveInfo accessDBPSDriveInfo = drive as AccessDBPSDriveInfo;

      if (accessDBPSDriveInfo == null)
      {
         return null;
      }

      accessDBPSDriveInfo.Connection.Close();

      return accessDBPSDriveInfo;
    }