Pregunta

Recientemente he estado aprendiendo sobre WMI y WQL. Descubrí la lista de clases de Win32 (de MSDN) que puedo consultar pero no puedo encontrar la lista de clases de eventos (debería ser el subconjunto de la lista de clases de Win32, ¿no?) ¿Tienes una lista o algún tipo de hoja de trucos para esto? Solo estoy preguntando esto por curiosidad.

Ejemplo para una clase de evento - Win32_ProcessStartTrace

¿Fue útil?

Solución

Aquí se explica cómo enumerar las clases de eventos WMI en el espacio de nombres root \ cimv2 con C # y System.Management :

using System;
using System.Management;

class Program
{
    static void Main()
    {
        string query =
            @"Select * From Meta_Class Where __This Isa '__Event'";

        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher(query);

        foreach (ManagementBaseObject cimv2Class in searcher.Get())
        {
            Console.WriteLine(cimv2Class.ClassPath.ClassName);
        }
    }
}

root \ cimv2 es el espacio de nombres WMI predeterminado, por lo que no tiene que usar una instancia de ManagementScope . La consulta WQL pasada a ManagementObjectSearcher es una consulta de metadatos WMI. Utiliza:

  • Meta_Class para designar la consulta como una consulta de esquema, y ??
  • __Esta propiedad para enumerar recursivamente las subclases de __Event

(consulte aquí y aquí ).

La clase WMI es una clase de evento si su proveedor se implementó como un proveedor WMI de evento y debe ser una subclase de __Event . Esto no significa que no pueda usar clases WMI 'ordinarias' como Win32_Process y Win32_Service en consultas de eventos WQL. Solo tiene que usar una de las clases auxiliares derivadas de __InstanceOperationEvent como __InstanceCreationEvent o __InstanceDeletionEvent , y WMI usará su propio subsistema de eventos para entregar eventos.

Aquí hay una consulta WQL de muestra que se suscribe a los eventos de creación de Win32_Process :

Select * From __InstanceCreationEvent Within 5 Where TargetInstance Isa 'Win32_Process'

En este caso, debe usar el Dentro de la cláusula .

Otros consejos

WMI Code Creator es una gran herramienta para aprender WMI que, entre otras cosas, le permite explorar las clases de eventos WMI en la computadora local o remota y generar código para recibir notificaciones de eventos.

Editar: Dado que etiquetó su pregunta como C # , podría estar interesado en el código para obtener la lista de clases de eventos derivadas de una clase particular mediante programación:

using System.Management;
...

string ancestor = "WMIEvent";     // the ancestor class
string scope = "root\\wmi";       // the WMI namespace to search within

try
{
    EnumerationOptions options = new EnumerationOptions();
    options.ReturnImmediately = true;
    options.Rewindable = false;

    ManagementObjectSearcher searcher =
        new ManagementObjectSearcher(scope, "SELECT * FROM meta_class", options);

    foreach (ManagementClass cls in searcher.Get())
    {
        if (cls.Derivation.Contains(ancestor))
        {
            Console.WriteLine(cls["__CLASS"].ToString());
        }
    }
}
catch (ManagementException exception)
{
    Console.WriteLine(exception.Message);
}

¿MSDN no tiene una lista de todos los Clases de MSMCA aquí

ACTUALIZACIÓN:
No trabajo mucho con WMI, pero acabo de encontrar esto herramienta WMI que hubiera sido útil. Le proporciona una GUI para ver la jerarquía de objetos de WMI e incluso le permite registrar y consumir eventos. Esto debería darle la información que necesita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top