Partager via


Extraction de collections d'objets de gestion

L'exemple de code suivant utilise les classes de collection System.Management pour énumérer des variables d'environnement sur un ordinateur. Certains paramètres peuvent conserver leurs valeurs par défaut dans cet exemple parce que les informations sont extraites de l'ordinateur local. L'exemple retourne une collection de tous les objets de la classe spécifiée (Win32_Environment). Après avoir extrait cette collection, le code énumère son contenu à l'aide de l'instruction foreach et affiche le nom et la valeur de chaque variable figurant dans la collection. Les développeurs habitués à l'API de script pour WMI noteront certaines ressemblances. L'exemple contient deux variantes : la première utilise la classe ManagementObjectSearcher avec une requête sous sa forme la plus simple, qui revient à une énumération complète ; la seconde obtient l'objet classe pour Win32_Environment et emploie la méthode GetInstances() pour énumérer ses instances.

using System;
using System.Management;

// This example demonstrates how to perform a synchronous instance enumeration.

public class EnumerateInstances {
    public static int Main(string[] args) {
      // Build a query for enumeration of Win32_Environment instances
      SelectQuery query = new SelectQuery("Win32_Environment");

      // Instantiate an object searcher with this query
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 

      // Call Get() to retrieve the collection of objects and loop through it
      foreach (ManagementBaseObject envVar in searcher.Get())
         Console.WriteLine("Variable : {0}, Value = {1}", 
            envVar["Name"],envVar["VariableValue"]);
      return 0;
    }
}

[Visual Basic]
Imports System
Imports System.Management
' This example demonstrates how to perform a synchronous instance enumeration.

Public Class EnumerateInstances  
   Overloads Public Shared Function Main(args() As String) As Integer
      ' Build a query for enumeration of Win32_Environment instances
      Dim query As New SelectQuery("Win32_Environment")

      ' Instantiate an object searcher with this query
      Dim searcher As New ManagementObjectSearcher(query)

      ' Call Get() to retrieve the collection of objects and loop through it
      Dim envVar As ManagementBaseObject
      For Each envVar In  searcher.Get()
         Console.WriteLine("Variable : {0}, Value = {1}", _
            envVar("Name"), envVar("VariableValue"))
      Next envVar
      Return 0
   End Function 
End Class

L'accès aux informations de gestion a souvent lieu dans des environnements distribués et peut concerner de grandes quantités de données. Compte tenu de ces contraintes, il peut être préférable d'effectuer les opérations de gestion de manière asynchrone. L'exemple suivant montre comment énumérer tous les services d'un ordinateur de façon asynchrone. La méthode employée pour appeler une opération de façon asynchrone est une surcharge de la méthode synchrone, qui admet un paramètre supplémentaire de type ManagementOperationObserver, permettant de gérer les rappels pour les résultats. Cet objet définit pour la notification des résultats et de l'achèvement des événements auxquels vous abonnez des gestionnaires qui s'exécutent lorsque ces événements sont déclenchés.

using System;
using System.Management;

// This example demonstrates how to perform an asynchronous instance enumeration.

public class EnumerateInstancesAsync {
    public static int Main(string[] args) {
      //Enumerate asynchronously using Object Searcher
      //===============================================

      //Instantiate an object searcher with the query
      ManagementObjectSearcher searcher = 
         new ManagementObjectSearcher(new SelectQuery("Win32_Service")); 

      // Create a results watcher object, and handler for results and completion
      ManagementOperationObserver results = new ManagementOperationObserver();
      ObjectHandler objectHandler = new ObjectHandler();

      // Attach handler to events for results and completion
      results.ObjectReady += new ObjectReadyEventHandler(objectHandler.NewObject);
      results.Completed += new CompletedEventHandler(objectHandler.Done);

      //Call the asynchronous overload of Get() to start the enumeration
      searcher.Get(results);
         
      //Do something else while results arrive asynchronously
      while (!objectHandler.IsCompleted) {
         System.Threading.Thread.Sleep (1000);
      }

      objectHandler.Reset();
      return 0;
   }


   //Handler for asynchronous results
   public class ObjectHandler {
      private bool isCompleted = false;

      public void NewObject(object sender, ObjectReadyEventArgs obj) {
         Console.WriteLine("Service : {0}, State = {1}", 
            obj.NewObject["Name"], obj.NewObject["State"]);
      }

      public bool IsCompleted {
         get { 
            return isCompleted;
         }
      }
      
      public void Reset()   {
         isCompleted = false;
      }

      public void Done(object sender, CompletedEventArgs obj) {
         isCompleted = true;
      }
   }
}

Voir aussi

Accès aux informations de gestion avec System.Management | Soumission de requêtes pour obtenir des informations de gestion | Abonnement à des événements de gestion et consommation de ces événements | Exécution de méthodes sur des objets de gestion | Options d'accès distant et de connexion | Utilisation d'objets fortement typés