Partager via


Création d’un fournisseur de conteneurs Windows PowerShell

Cette rubrique explique comment créer un fournisseur Windows PowerShell qui peut fonctionner sur des magasins de données multicouches. Pour ce type de magasin de données, le niveau supérieur du magasin contient les éléments racines et chaque niveau suivant est appelé nœud d’éléments enfants. En permettant à l’utilisateur de travailler sur ces nœuds enfants, un utilisateur peut interagir hiérarchiquement via le magasin de données.

Les fournisseurs qui peuvent fonctionner sur des magasins de données multiniveaux sont appelés fournisseurs de conteneurs Windows PowerShell. Toutefois, n’oubliez pas qu’un fournisseur de conteneurs Windows PowerShell ne peut être utilisé qu’en présence d’un seul conteneur (aucun conteneur imbriqué) avec des éléments qu’il contient. S’il existe des conteneurs imbriqués, vous devez implémenter un fournisseur de navigation Windows PowerShell. Pour plus d’informations sur l’implémentation du fournisseur de navigation Windows PowerShell, consultez Création d’un fournisseur de navigation Windows PowerShell.

Remarque

Vous pouvez télécharger le fichier source C# (AccessDBSampleProvider04.cs) pour ce fournisseur à l’aide du Kit de développement logiciel Microsoft Windows pour Windows Vista et .NET Framework 3.0 Runtime Components. Pour obtenir des instructions de téléchargement, consultez Comment installer Windows PowerShell et télécharger le Kit de développement logiciel (SDK) Windows PowerShell. Les fichiers sources téléchargés sont disponibles dans le répertoire <Exemples PowerShell>. Pour plus d’informations sur les autres implémentations de fournisseurs Windows PowerShell, consultez Conception de votre fournisseur Windows PowerShell.

Le fournisseur de conteneurs Windows PowerShell décrit ici définit la base de données comme conteneur unique, avec les tables et les lignes de la base de données définies comme éléments du conteneur.

Avertissement

N’oubliez pas que cette conception suppose qu’une base de données a un champ portant l’ID de nom et que le type du champ est LongInteger.

Définition d’une classe de fournisseur de conteneurs Windows PowerShell

Un fournisseur de conteneurs Windows PowerShell doit définir une classe .NET qui dérive de la classe de base System.Management.Automation.Provider.ContainerCmdletProvider. Voici la définition de classe pour le fournisseur de conteneurs Windows PowerShell décrit dans cette section.

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

Notez que dans cette définition de classe, l’attribut System.Management.Automation.Provider.CmdletProviderAttribute inclut deux paramètres. Le premier paramètre spécifie un nom convivial pour le fournisseur utilisé par Windows PowerShell. Le deuxième paramètre spécifie les fonctionnalités spécifiques de Windows PowerShell exposées par le fournisseur au runtime Windows PowerShell pendant le traitement des commandes. Pour ce fournisseur, aucune fonctionnalité spécifique à Windows PowerShell n’est ajoutée.

Définition des fonctionnalités de base

Comme décrit dans Conception de votre fournisseur Windows PowerShell, la classe System.Management.Automation.Provider.ContainerCmdletProvider dérive de plusieurs autres classes qui ont fourni différentes fonctionnalités de fournisseur. Un fournisseur de conteneurs Windows PowerShell doit donc définir toutes les fonctionnalités fournies par ces classes.

Pour implémenter des fonctionnalités permettant d’ajouter des informations d’initialisation spécifiques à la session et de libérer des ressources utilisées par le fournisseur, consultez Création d’un fournisseur Windows PowerShell de base. Toutefois, la plupart des fournisseurs (y compris le fournisseur décrit ici) peuvent utiliser l’implémentation par défaut de cette fonctionnalité fournie par Windows PowerShell.

Pour accéder au magasin de données, le fournisseur doit implémenter les méthodes de l'System.Management.Automation.Provider.DriveCmdletProvider classe de base. Pour plus d’informations sur l’implémentation de ces méthodes, consultez Création d’un fournisseur de lecteur Windows PowerShell.

Pour manipuler les éléments d’un magasin de données, tels que l’obtention, la définition et l’effacement des éléments, le fournisseur doit implémenter les méthodes fournies par l'System.Management.Automation.Provider.ItemCmdletProvider classe de base. Pour plus d’informations sur l’implémentation de ces méthodes, consultez Création d’un fournisseur d’éléments Windows PowerShell.

Récupération d’éléments enfants

Pour récupérer un élément enfant, le fournisseur de conteneurs Windows PowerShell doit remplacer la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* pour prendre en charge les appels à partir de l’applet de commande Get-ChildItem. Cette méthode récupère les éléments enfants du magasin de données et les écrit dans le pipeline en tant qu’objets. Si le paramètre recurse de l’applet de commande est spécifié, la méthode récupère tous les enfants quel que soit le niveau auquel ils se trouvent. Si le paramètre recurse n’est pas spécifié, la méthode récupère un seul niveau d’enfants.

Voici l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* pour ce fournisseur. Notez que cette méthode récupère les éléments enfants dans toutes les tables de base de données lorsque le chemin d’accès indique la base de données Access et récupère les éléments enfants à partir des lignes de cette table si le chemin indique une table de données.

protected override void GetChildItems(string path, bool recurse)
{
    // If path represented is a drive then the children in the path are 
    // tables. Hence all tables in the drive represented will have to be
    // returned
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table, path, true);

            // if the specified item exists and recurse has been set then 
            // all child items within it have to be obtained as well
            if (ItemExists(path) && recurse)
            {
                GetChildItems(path + pathSeparator + table.Name, recurse);
            }
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get the table name, row number and type of path from the
        // path specified
        string tableName;
        int rowNumber;

        PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Table)
        {
            // Obtain all the rows within the table
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);
            WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
        }
        else
        {
            // In this case, the path specified is not valid
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildItems

Éléments à mémoriser à propos de l’implémentation de GetChildItems

Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:

Attachement de paramètres dynamiques à l’applet de commande Get-ChildItem

Parfois, l’applet de commande Get-ChildItem qui appelle System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs Windows PowerShell doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItemsDynamicParameters*. Cette méthode récupère les paramètres dynamiques de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande Get-ChildItem.

Ce fournisseur de conteneurs Windows PowerShell n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de cette méthode.

Récupération des noms d’éléments enfants

Pour récupérer les noms des éléments enfants, le fournisseur de conteneurs Windows PowerShell doit remplacer la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* pour prendre en charge les appels à partir de l’applet de commande Get-ChildItem lorsque son paramètre Name est spécifié. Cette méthode récupère les noms des éléments enfants pour le chemin d’accès spécifié ou les noms d’éléments enfants pour tous les conteneurs si le paramètre returnAllContainers de l’applet de commande est spécifié. Un nom enfant est la partie feuille d’un chemin d’accès. Par exemple, le nom enfant du chemin d’accès C:\windows\system32\abc.dll est «abc.dll». Le nom enfant du répertoire C :\windows\system32 est « system32 ».

Voici l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* pour ce fournisseur. Notez que la méthode récupère les noms de table si le chemin spécifié indique la base de données Access (lecteur) et les numéros de ligne si le chemin indique une table.

protected override void GetChildNames(string path,
                              ReturnContainers returnContainers)
{
    // If the path represented is a drive, then the child items are
    // tables. get the names of all the tables in the drive.
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table.Name, path, true);
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get type, table name and row number from path specified
        string tableName;
        int rowNumber;

        PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Table)
        {
            // Get all the rows in the table and then write out the 
            // row numbers.
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row.RowNumber, path, false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);

            WriteItemObject(row.RowNumber, path, false);
        }
        else
        {
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildNames

Éléments à mémoriser sur l’implémentation de GetChildNames

Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:

Attachement de paramètres dynamiques à l’applet de commande Get-ChildItem (nom)

Parfois, l’applet de commande Get-ChildItem (avec le paramètre Name) nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs Windows PowerShell doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNamesDynamicParameters*. Cette méthode récupère les paramètres dynamiques de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande Get-ChildItem.

Ce fournisseur n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de cette méthode.

Renommage d’éléments

Pour renommer un élément, un fournisseur de conteneurs Windows PowerShell doit remplacer la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* pour prendre en charge les appels à partir de l’applet de commande Rename-Item. Cette méthode modifie le nom de l’élément au chemin d’accès spécifié au nouveau nom fourni. Le nouveau nom doit toujours être relatif à l’élément parent (conteneur).

Ce fournisseur ne remplace pas la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem*. Toutefois, voici l’implémentation par défaut.

Éléments à mémoriser à propos de l’implémentation de RenameItem

Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem*:

Attachement de paramètres dynamiques à l’applet de commande Rename-Item

Parfois, l’applet de commande Rename-Item nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs Windows PowerShell doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItemDynamicParameters*. Cette méthode récupère les paramètres de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande Rename-Item.

Ce fournisseur de conteneurs n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de cette méthode.

Création d’éléments

Pour créer de nouveaux éléments, un fournisseur de conteneurs doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* pour prendre en charge les appels à partir de l’applet de commande New-Item. Cette méthode crée un élément de données situé au chemin spécifié. Le paramètre type de l’applet de commande contient le type défini par le fournisseur pour le nouvel élément. Par exemple, le fournisseur FileSystem utilise un paramètre type avec la valeur « file » ou « directory ». Le paramètre newItemValue de l’applet de commande spécifie une valeur spécifique au fournisseur pour le nouvel élément.

Voici l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* pour ce fournisseur.

protected override void NewItem( string path, string type, object newItemValue )
{
    // Create the new item here after
    // performing necessary validations
    //
    // WriteItemObject(newItemValue, path, false);

    // Example
    //
    // if (ShouldProcess(path, "new item"))
    // {
    //      // Create a new item and then call WriteObject
    //      WriteObject(newItemValue, path, false);
    // }

} // NewItem
{
    case 1:
        {
            string name = pathChunks[0];

            if (TableNameIsValid(name))
            {
                tableName = name;
                retVal = PathType.Table;
            }
        }
        break;

    case 2:
        {
            string name = pathChunks[0];

Éléments à mémoriser sur l’implémentation de NewItem

Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:

Attachement de paramètres dynamiques à l’applet de commande New-Item

Parfois, l’applet de commande New-Item nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItemDynamicParameters*. Cette méthode récupère les paramètres de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande New-Item.

Ce fournisseur n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de cette méthode.

Suppression d’éléments

Pour supprimer des éléments, le fournisseur Windows PowerShell doit remplacer la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* pour prendre en charge les appels de l’applet de commande Remove-Item. Cette méthode supprime un élément du magasin de données au chemin d’accès spécifié. Si le paramètre recurse de l’applet de commande Remove-Item est défini sur true, la méthode supprime tous les éléments enfants indépendamment de leur niveau. Si le paramètre est défini sur false, la méthode supprime un seul élément au niveau du chemin spécifié.

Ce fournisseur ne prend pas en charge la suppression d’éléments. Toutefois, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*.

Éléments à mémoriser à propos de l’implémentation de RemoveItem

Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:

Attachement de paramètres dynamiques à l’applet de commande Remove-Item

Parfois, l’applet de commande Remove-Item nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters* pour gérer ces paramètres. Cette méthode récupère les paramètres dynamiques de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande Remove-Item.

Ce fournisseur de conteneurs n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters*.

Interrogation d’éléments enfants

Pour vérifier si des éléments enfants existent sur le chemin spécifié, le fournisseur de conteneurs Windows PowerShell doit remplacer la méthode System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*. Cette méthode retourne true si l’élément a des enfants et false sinon. Pour un chemin null ou vide, la méthode considère tous les éléments du magasin de données comme des enfants et retourne true.

Voici le remplacement de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*. S’il existe plus de deux parties de chemin créées par la méthode d’assistance ChunkPath, la méthode retourne false, car seul un conteneur de base de données et un conteneur de table sont définis. Pour plus d’informations sur cette méthode d’assistance, consultez la méthode ChunkPath décrite dans Création d’un fournisseur d’éléments Windows PowerShell.

protected override bool HasChildItems( string path )
{
    return false;
} // HasChildItems
        ErrorCategory.InvalidOperation, tableName));
}

return results;

Éléments à mémoriser sur l’implémentation de HasChildItems

Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*:

Copie d’éléments

Pour copier des éléments, le fournisseur de conteneurs doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem pour prendre en charge les appels à partir de l’applet de commande Copy-Item. Cette méthode copie un élément de données à partir de l’emplacement indiqué par le paramètre path de l’applet de commande à l’emplacement indiqué par le paramètre copyPath. Si le paramètre recurse est spécifié, la méthode copie tous les sous-conteneurs. Si le paramètre n’est pas spécifié, la méthode copie un seul niveau d’éléments.

Ce fournisseur n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.

Éléments à mémoriser sur l’implémentation de CopyItem

Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:

Attachement de paramètres dynamiques à l’applet de commande Copy-Item

Parfois, l’applet de commande Copy-Item nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs Windows PowerShell doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters* pour gérer ces paramètres. Cette méthode récupère les paramètres de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande Copy-Item.

Ce fournisseur n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*.

Exemple de code

Pour obtenir un exemple de code complet, consultez AccessDbProviderSample04 Code Sample.

Génération du fournisseur Windows PowerShell

Consultez Comment inscrire des applets de commande, des fournisseurs et des applications hôtes.

Test du fournisseur Windows PowerShell

Lorsque votre fournisseur Windows PowerShell a été inscrit auprès de Windows PowerShell, vous pouvez le tester en exécutant les applets de commande prises en charge sur la ligne de commande. N’oubliez pas que l’exemple de sortie suivant utilise une base de données Access fictive.

  1. Exécutez l’applet de commande Get-ChildItem pour récupérer la liste des éléments enfants d’une table Customers dans la base de données Access.

    Get-ChildItem mydb:customers
    

    La sortie suivante s’affiche.

    PSPath        : AccessDB::customers
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : True
    Data          : System.Data.DataRow
    Name          : Customers
    RowCount      : 91
    Columns       :
    
  2. Réexécutez l’applet de commande Get-ChildItem pour récupérer les données d’une table.

    (Get-ChildItem mydb:customers).Data
    

    La sortie suivante s’affiche.

    TABLE_CAT   : C:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. Utilisez maintenant l’applet de commande Get-Item pour récupérer les éléments de la ligne 0 dans la table de données.

    Get-Item mydb:\customers\0
    

    La sortie suivante s’affiche.

    PSPath        : AccessDB::customers\0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data          : System.Data.DataRow
    RowNumber     : 0
    
  4. Réutilisez Get-Item pour récupérer les données des éléments de la ligne 0.

    (Get-Item mydb:\customers\0).Data
    

    La sortie suivante s’affiche.

    CustomerID   : 1234
    CompanyName  : Fabrikam
    ContactName  : Eric Gruber
    ContactTitle : President
    Address      : 4567 Main Street
    City         : Buffalo
    Region       : NY
    PostalCode   : 98052
    Country      : USA
    Phone        : (425) 555-0100
    Fax          : (425) 555-0101
    
  5. Utilisez maintenant l’applet de commande New-Item pour ajouter une ligne à une table existante. Le paramètre Path spécifie le chemin d’accès complet à la ligne et doit indiquer un numéro de ligne supérieur au nombre de lignes existant dans la table. Le paramètre Type indique Row pour spécifier ce type d’élément à ajouter. Enfin, le paramètre Value spécifie une liste délimitée par des virgules de valeurs de colonne pour la ligne.

    New-Item -Path mydb:\Customers\3 -ItemType "Row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
    
  6. Vérifiez la justesse de la nouvelle opération d’élément comme suit.

    PS mydb:\> cd Customers
    PS mydb:\Customers> (Get-Item 3).Data
    

    La sortie suivante s’affiche.

    ID        : 3
    FirstName : Eric
    LastName  : Gruber
    Email     : ericgruber@fabrikam.com
    Title     : President
    Company   : Fabrikam
    WorkPhone : (425) 555-0100
    Address   : 4567 Main Street
    City      : Buffalo
    State     : NY
    Zip       : 98052
    Country   : USA
    

Voir aussi

création de fournisseurs Windows PowerShell

conception de votre fournisseur Windows PowerShell

implémentation d’un fournisseur Windows PowerShell d’élément

implémentation d’un fournisseur Windows PowerShell de navigation

Comment inscrire des applets de commande, des fournisseurs et des applications hôtes

sdk Windows PowerShell

Guide du programmeur Windows PowerShell