Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
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 :
Vérifiez que le membre System.Management.Automation.PSDriveinfo.Root* existe et qu’une connexion au magasin de données peut être établie.
Créez un disque et remplissez le membre de connexion, en soutien au
New-PSDrivecmdlet.Validez l’objet System.Management.Automation.PSDriveinfo pour le disque proposé.
Modifiez l’objet System.Management.Automation.PSDriveinfo qui décrit le disque avec toute information de performance ou de fiabilité requise, ou fournissez des données supplémentaires aux appelants utilisant le disque.
Gérer les défaillances en utilisant la méthode System.Management.Automation.Provider.CmdletProvider.WriteError puis retourner
null.Cette méthode renvoie soit les informations du disque transmises à la méthode, soit une version spécifique au fournisseur.
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.
Exécutez le
Get-PSProvidercmdlet pour récupérer la liste des fournisseurs afin de vous assurer que le fournisseur du disque AccessDB est présent :PS>
Get-PSProviderVous 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}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 .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.mdbValider 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 :Retirez le lecteur et sortez de la coque :
PS> Remove-PSDrive mydb PS> exit
Voir aussi
Création de fournisseurs Windows PowerShell