6

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

事件类的示例 - Win32_ProcessStartTrace

4

3 回答 3

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

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

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

(见这里这里)。

如果 WMI 类的提供程序实现为事件 WMI 提供程序并且必须是__Event. 这并不意味着您不能在 WQL 事件查询中使用“普通”WMI 类,例如Win32_Process和。Win32_Service您只需使用__InstanceOperationEvent派生的辅助类之一,如__InstanceCreationEventor __InstanceDeletionEvent,WMI 将使用其自己的事件子系统来传递事件。

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

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

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

于 2009-06-25T19:52:51.897 回答
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);
}
于 2009-06-25T13:29:54.060 回答
3

MSDN 此处没有所有MSMCA 类的列表吗

更新:
我没有用 WMI 做大量的工作,但我只是发现这个WMI 工具会很有帮助。它为您提供了一个用于查看对象的 WMI 层次结构的 GUI,甚至允许您注册和使用事件。这应该为您提供所需的信息。

于 2009-06-25T10:48:01.033 回答