Lista de clases de WMIEvent
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
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
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
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.