最近我一直在学习WMI和WQL。我找到了我可以查询的Win32类列表(来自MSDN),但我无法找到事件类列表(应该是Win32类列表的子集不是吗?)是否有任何一个为此有一份清单或某种备忘单?出于好奇,我很想问这个问题。
事件类的示例 - Win32_ProcessStartTrace
答案 0 :(得分: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);
}
答案 1 :(得分:6)
以下是使用C#和root\cimv2
在System.Management
命名空间中列出WMI事件类的方法:
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
实例。传递给ManagementObjectSearcher
的WQL查询是WMI元数据查询。它使用:
Meta_Class
将查询指定为架构查询,__This
属性以递归方式列出__Event
子类如果WMI类的提供者实现为事件WMI提供者并且必须是__Event
的子类,则WMI类是一个事件类。这并不意味着您不能在WQL事件查询中使用“普通”WMI类,如Win32_Process
和Win32_Service
。您只需使用__InstanceOperationEvent
派生的辅助类之一,如__InstanceCreationEvent
或__InstanceDeletionEvent
,WMI将使用自己的事件子系统来传递事件。
以下是订阅Win32_Process
创建事件的示例WQL查询:
Select * From __InstanceCreationEvent Within 5 Where TargetInstance Isa 'Win32_Process'
在这种情况下,您必须使用Within
子句。
答案 2 :(得分:3)
MSDN是否包含所有MSMCA classes here
的列表 <强>更新强>
我不会对WMI做很多工作,但我发现这个WMI tool会有所帮助。它为您提供了一个用于查看对象的WMI层次结构的GUI,甚至允许您注册和使用事件。这应该为您提供所需的信息。