Énumération de WMI

L'énumération est l'action de se déplacer dans un ensemble d'objets et de modifier éventuellement chaque objet au fur et à mesure. Par exemple, vous pouvez énumérer un ensemble d’objets Win32_DiskDrive pour rechercher un numéro de série particulier. Notez que bien que vous puissiez énumérer n’importe quel objet, WMI retourne uniquement les objets auxquels vous avez accès en sécurité.

Les énumérations de jeux de données volumineux peuvent nécessiter une grande quantité de ressources et dégrader les performances. Pour plus d’informations, consultez Amélioration des performances d’énumération. Vous pouvez également demander des données avec une requête plus spécifique. Pour plus d'informations, consultez Interroger WMI.

Les sections suivantes sont abordées dans cette rubrique :

Énumération de WMI à l’aide de PowerShell

Si vous ne connaissez pas le chemin d’accès de l’objet pour une instance spécifique, ou si vous souhaitez récupérer toutes les instances d’une classe spécifique, utilisez Get-WmiObject, avec le nom de la classe dans le paramètre -class. Si vous souhaitez utiliser une requête, vous pouvez utiliser le paramètre -query.

La procédure suivante décrit comment énumérer les instances d’une classe à l’aide de PowerShell.

Pour énumérer les instances d’une classe à l’aide de PowerShell

  1. Énumérez les instances avec un appel à l’applet de commande Get-WmiObject.

    Get-WmiObject retourne une collection d’un ou plusieurs objets WMI, via lesquels vous pouvez énumérer. Pour plus d’informations, consultez Accès à une collection.

    Si vous souhaitez récupérer une instance de classe WMI dans un autre espace de noms ou sur un autre ordinateur, spécifiez l’ordinateur et l’espace de noms dans les paramètres -computer et -namespace, respectivement. Pour plus d’informations, consultez Création d’un script WMI. Cela ne fonctionne que si vous disposez des privilèges d’accès appropriés. Pour plus d’informations, consultez Maintenance de la sécurité WMI et Exécution d’opérations privilégiées.

  2. Récupérez les instances individuelles de votre choix à l’aide des membres de la collection.

L’exemple de code suivant récupère une collection PowerShell, puis affiche la propriété size pour toutes les instances de lecteurs logiques sur l’ordinateur local.

$objCol = get-wmiobject -class "Win32_LogicalDisk"

# Or, alternately
#$objCol = get-wmiobject -Query "SELECT * FROM Win32_LogicalDisk"

foreach ($Drive in $objCol)
{
    if ($Drive.size -ne $null)
    { "Drive " + $Drive.deviceID + " contains " + $Drive.size + " bytes" }
    else
    { "Drive " + $Drive.deviceID + " is not available." }
}

Énumération de WMI à l’aide de C# (Microsoft.Management.Infrastructure)

  1. Ajouter une référence à l'assemby de référence Microsoft.Management.Infrastructure. (Cet assembly est fourni dans le cadre du Kit de développement logiciel (SDK) Windows pour Windows 8.)
  2. Ajouter une instruction d'utilisation pour l'espace de noms Microsoft.Management.Infrastructure.
    using Microsoft.Management.Infrastructure;
  1. Instancier un objet CimSession. L’extrait de code suivant utilise la valeur « localhost » standard pour la méthode CimSession.Create.
    CimSession cimSession = CimSession.Create("localhost");
  1. Appelez la méthode CimSession.QueryInstances en passant l’espace de noms CIM souhaité et WQL à utiliser. L’extrait de code suivant retourne deux instances représentant deux processus Windows standard où la propriété handle (représentant un ID de processus ou PID) a une valeur de 0 ou 4.
    IEnumerable<CimInstance> queryInstances =     
      cimSession.QueryInstances(@"root\cimv2", 
                                "WQL", 
                                @"select name from win32_process where handle = 0 or handle = 4");
  1. Parcourez les objets CimInstance retournés.
    foreach (CimInstance cimInstance in enumeratedInstances)
    { 
      Console.WriteLine("Process name: {0}", cimInstance.CimInstanceProperties["Name"].Value);  
    }

L’exemple de code suivant énumère toutes les instances de la classe Win32_Process (qui représente les processus actifs) sur l’ordinateur local et imprime le nom de chaque processus.

Notes

Dans une application réelle, vous définissez en tant que paramètres le nom de l’ordinateur (« localhost ») et l’espace de noms CIM (« root\cimv2 »). Par souci de simplicité, ceux-ci ont été codés en dur dans cet exemple.

 

using System;
using System.Collections.Generic;
using Microsoft.Management.Infrastructure;

public partial class MI
{
    static void PrintCimInstance(CimInstance cimInstance)
    {
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.WriteLine("{0} properties", cimInstance.CimSystemProperties.ClassName);
        Console.ResetColor();

        Console.WriteLine(String.Format("{0,-5}{1,-30}{2,-15}{3,-10}", 
                                        "Key?", "Property", "Type", "Value"));

        foreach (var enumeratedProperty in cimInstance.CimInstanceProperties)
        {
            bool isKey = ((enumeratedProperty.Flags & CimFlags.Key) == CimFlags.Key);

            if (enumeratedProperty.Value != null)
            {
                Console.WriteLine(
                    "{0,-5}{1,-30}{2,-15}{3,-10}",
                    isKey == true ? "Y" : string.Empty,
                    enumeratedProperty.Name,
                    enumeratedProperty.CimType,
                    enumeratedProperty.Value);
            }
        }
        Console.WriteLine();
    }

    public static void QueryInstance(string query)
    {
        try
        {
            CimSession cimSession = CimSession.Create("localhost");

            IEnumerable<CimInstance> queryInstances = 
              cimSession.QueryInstances(@"root\cimv2", "WQL", query);
            foreach (CimInstance cimInstance in queryInstances)
            {
                //Use the current instance. This example prints the instance. 
                PrintCimInstance(cimInstance);
            }
        }
         catch (CimException ex) 
        { 
            // Handle the exception as appropriate.
            // This example prints the message.
            Console.WriteLine(ex.Message); 
        }
    }
}

using System;

namespace MIClientManaged
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Write(&quot;Enter WQL (x = Quit): &quot;);
                string query = Console.ReadLine().ToUpper();
                if (query.CompareTo(&quot;X&quot;) == 0) break;
                MI.QueryInstance(query);
            }
        }
    }
}

Énumération de WMI à l’aide de C# (System.Management)

Si vous ne connaissez pas le chemin d’accès de l’objet pour une instance spécifique ou si vous souhaitez récupérer toutes les instances d’une classe spécifique, utilisez l’objet ManagementClass pour récupérer un objet ManagementObjectCollection qui contient toutes les instances d’une classe donnée dans l’espace de noms WMI. Vous pouvez également interroger WMI via un objet ManagementObjectSearcher pour obtenir le même ensemble d’objets.

Notes

System.Management était l’espace de noms .NET d’origine utilisé pour accéder à WMI ; toutefois, les API de cet espace de noms sont généralement plus lentes et ne sont pas mises à l’échelle aussi bien par rapport à leurs équivalents Microsoft.Management.Infrastructure plus modernes.

 

La procédure suivante décrit comment énumérer les instances d’une classe à l’aide de C#.

Pour énumérer les instances d’une classe à l’aide de C#

  1. Énumérez les instances avec un appel à ManagementClass.GetInstances.

    La méthode GetInstances renvoie une collection, ou un ensemble, d’objets par le biais duquel vous pouvez énumérer. Pour plus d’informations, consultez Accès à une collection. La collection retournée est en fait un objet ManagementObjectCollection, de sorte que l’une des méthodes de cet objet peut être appelée.

    Si vous souhaitez récupérer une instance de classe WMI dans un autre espace de noms ou sur un autre ordinateur, spécifiez l’ordinateur et l’espace de noms dans les paramètres path. Pour plus d’informations, consultez Création d’un script WMI. Cela ne fonctionne que si vous disposez des privilèges d’accès appropriés. Pour plus d’informations, consultez Maintenance de la sécurité WMI et Exécution d’opérations privilégiées.

  2. Récupérez les instances individuelles de votre choix à l’aide des membres de la collection.

L’exemple de code suivant récupère une collection C#, puis affiche la propriété size pour toutes les instances de lecteurs logiques sur l’ordinateur local.

using System.Management;
...

ManagementClass mc = new ManagementClass("Win32_LogicalDisk");
ManagementObjectCollection objCol = mc.GetInstances();

//or, alternately
//ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
//ManagementObjectCollection objCol = mgmtObjSearcher.Get();

if (objCol.Count != 0)
{
   foreach (ManagementObject Drive in objCol)
   {
      if (Drive["size"] != null)
      {
         Console.WriteLine("Drive {0} contains {1} bytes.", Drive["deviceID"], Drive["size"]);
      }
      else
      {
         Console.WriteLine("Drive {0} is not available.", Drive["deviceID"]);
      }
   }
}
Console.ReadLine();

Énumération de WMI à l’aide de VBScript

Si vous ne connaissez pas le chemin d’accès de l’objet pour une instance spécifique ou si vous souhaitez récupérer toutes les instances d’une classe spécifique, utilisez la méthode SWbemServices.InstancesOf pour renvoyer une énumération SWbemObjectSet de toutes les instances d’une classe. Vous pouvez également interroger WMI via SWbemServices.ExecQuery pour obtenir le même ensemble d’objets.

La procédure suivante décrit comment énumérer les instances d’une classe à l’aide de VBScript.

Pour énumérer les instances d’une classe à l’aide de VBScript

  1. Énumérez les instances avec un appel à la méthode SWbemServices.InstancesOf.

    La méthode InstancesOf renvoie une collection, ou un ensemble, d’objets par le biais duquel vous pouvez énumérer. Pour plus d’informations, consultez Accès à une collection. La collection retournée est en fait un objet SWbemObjectSet, de sorte que toutes les méthodes de cet objet peuvent être appelées.

    Si vous souhaitez récupérer une instance de classe WMI dans un autre espace de noms ou sur un autre ordinateur, spécifiez l’ordinateur et l’espace de noms dans le moniker. Pour plus d’informations, consultez Création d’un script WMI. Cela ne fonctionne que si vous disposez des privilèges d’accès appropriés. Pour plus d’informations, consultez Maintenance de la sécurité WMI et Exécution d’opérations privilégiées.

  2. Récupérez toutes les instances individuelles de votre choix à l’aide des méthodes de collection.

L’exemple de code suivant récupère un objet SWbemServices, puis exécute la méthode InstancesOf pour afficher la propriété size pour toutes les instances de lecteurs logiques sur l’ordinateur local.

Set objCol = GetObject("WinMgmts:").InstancesOf("Win32_LogicalDisk")
For Each Drive In objCol
    If Not IsNull(Drive.Size) Then    
       WScript.Echo ("Drive " & Drive.deviceid & " contains " & Drive.Size & " bytes")
    Else
       WScript.Echo ("Drive " & Drive.deviceid & " is not available.")
    End If
Next

Énumération de WMI à l’aide de C++

En plus d’effectuer une énumération de base, vous pouvez définir plusieurs indicateurs et propriétés pour augmenter les performances de votre énumération. Pour plus d’informations, consultez Amélioration des performances d’énumération.

Pour énumérer un jeu d’objets dans WMI

  1. Créez une interface IEnumWbemClassObject décrivant l’ensemble d’objets que vous souhaitez énumérer.

    Un objet IEnumWbemClassObject contient une liste décrivant un ensemble d’objets WMI. Vous pouvez utiliser les méthodes IEnumWbemClassObject pour énumérer les vers l’avant, ignorer les objets, commencer au début et copier l’énumérateur. Le tableau suivant répertorie les méthodes utilisées pour créer des énumérateurs pour différents types d’objets WMI.

    Object Méthode
    Classe
    IWbemServices::CreateClassEnum
    [IWbemServices::CreateClassEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createclassenumasync)
    Instance
    IWbemServices::CreateInstanceEnum
    [IWbemServices::CreateInstanceEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createinstanceenumasync)
    Résultat de la requête
    IWbemServices::ExecQuery
    [IWbemServices::ExecQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execqueryasync)
    Notification d'événement
    IWbemServices::ExecNotificationQuery
    [IWbemServices::ExecNotificationQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execnotificationqueryasync)

     

  2. Parcourez l’énumération retournée à l’aide de plusieurs appels à IEnumWbemClassObject::Next ou IEnumWbemClassObject::NextAsync.

Pour plus d’informations, consultez Manipulation des informations sur les classes et les instances.