Compartir a través de


Recuperar colecciones de objetos de administración

En el código de ejemplo siguiente se utilizan las clases de la colección System.Management para enumerar las variables de entorno de un equipo. En este ejemplo, algunos parámetros se pueden dejar con los valores predeterminados porque la información se obtiene del equipo local. Asimismo, se devuelve una colección que incluye todos los objetos de la clase especificada (Win32_Environment). Después de recuperar la colección, el código la enumera mediante la instrucción foreach y muestra el nombre y el valor de cada variable de la colección. Los programadores que estén familiarizados con la API Scripting para WMI notarán algunas similitudes. Se muestran dos variaciones: en la primera se usa la clase ManagementObjectSearcher con la forma más simple de una consulta que representa básicamente una enumeración completa; en la segunda se obtiene el objeto de clase para Win32_Environment y se usa el método GetInstances() para enumerar sus instancias.

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

El acceso a información de administración suele suceder en entornos distribuidos y puede tratarse de cantidades enormes de datos. Para hacerlo posible, las operaciones de administración también pueden realizarse de manera asincrónica. En el ejemplo siguiente se muestra cómo enumerar todos los servicios de un equipo en un modelo de codificación asincrónico. El método utilizado para llamar a una operación de manera asincrónica es una sobrecarga del método sincrónico, en la que se incluye un parámetro adicional del tipo ManagementOperationObserver con el fin de controlar las devoluciones de llamadas de los resultados. Este objeto define eventos para notificaciones de los resultados y de la finalización, a los que se suscriben controladores que se ejecutan cuando se generan estos eventos.

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;
      }
   }
}

Vea también

Acceso a la información de administración con System.Management | Consultar información de administración | Suscribir y consumir eventos | Ejecutar métodos en objetos de administración | Interacción remota y opciones de conexión | Utilizar objetos con establecimiento inflexible de tipos