WMIEvent类列表

sud*_*yes 6 c# wmi wmi-query wql

最近我一直在学习WMI和WQL.我找到了我可以查询的Win32类列表(来自MSDN),但是我无法找到事件类列表(应该是Win32类列表的子集不是吗?)是否有任何一个为此有一份清单或某种备忘单?出于好奇,我很想问这个问题.

事件类的示例 - Win32_ProcessStartTrace

Hel*_*len 6

WMI Code Creator是学习WMI的一个很好的工具,除了其他功能之外,它还允许您在本地或远程计算机上浏览WMI事件类,并生成用于接收事件通知的代码.

编辑:由于您将问题标记为C#,因此您可能对以编程方式获取从特定类派生的事件类列表的代码感兴趣:

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);
}
Run Code Online (Sandbox Code Playgroud)


小智 6

以下是root\cimv2使用C#列出命名空间中的WMI事件类的方法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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

root\cimv2是默认的WMI名称空间,因此您不必使用ManagementScope实例.传递给的WQL查询ManagementObjectSearcher是WMI元数据查询.它用:

  • Meta_Class 将查询指定为模式查询,以及
  • __This用于递归列出__Event子类的属性

(见这里这里).

如果WMI类的提供者实现为事件WMI提供者并且必须是其子类,则WMI类是一个事件类__Event.这并不意味着你不能用"普通" WMI类,如Win32_Process以及Win32_Service在WQL事件查询.您只需使用其中一个__InstanceOperationEvent派生的帮助程序类,__InstanceCreationEvent或者__InstanceDeletionEvent,WMI将使用自己的事件子系统来传递事件.

以下是订阅Win32_Process创建事件的示例WQL查询:

Select * From __InstanceCreationEvent Within 5 Where TargetInstance Isa 'Win32_Process'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您必须使用该Within子句.