我们在设计我们的系统监控解决方案,我们正在研究WMI作为一个可能的选项。
总之,我们要创建一个通用的系统,它应能订阅到WMI数据情况下多次更改。 我们正在进入__InstanceModificationEvent做到这一点:
下面的原型代码监控记事本上的任何实例的所有变化:
void StartMonitor()
{
var query = "SELECT * "
+ "FROM __InstanceModificationEvent "
+ "WITHIN 1 "
+ "WHERE TargetInstance Isa \"Win32_PerfFormattedData_PerfProc_Process\" "
+ "AND TargetInstance.Name = \"notepad\"";
var scope = new ManagementScope(@"root\cimv2", null);
scope.Connect();
EventQuery qry = new EventQuery(query);
ManagementEventWatcher w = new ManagementEventWatcher(scope, qry);
w.EventArrived += EventArrived;
w.Start();
}
void EventArrived(object sender, EventArrivedEventArgs e)
{
var targetInstance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
foreach (var p in targetInstance.Properties)
{
Console.WriteLine(p.Name + ":\t" + (p.Value != null ? p.Value.ToString() : "{null}"));
}
}
所以每当记事本的任何实例是变化,我们会得到这样的(节选)的输出
PageFileBytes: 1499136
PageFileBytesPeak: 1740800
PercentPrivilegedTime: 0
PercentProcessorTime: 0
PercentUserTime: 0
PoolNonpagedBytes: 7040
PoolPagedBytes: 172856
这是好的,但我们需要提高这一点。 例如,让我们假设我们只在改变PercentProcessorTime感兴趣。 在当前的代码,该事件将被每当对象改变任何发射。 这还不够好,因为我们可能会监控上百道工序在多台计算机。
因此,我们需要一种方法来指定我们只希望事件被触发时这样或那样的属性变化,而不是整个实例
这可能使用WMI? 什么是实现我们想要什么是最好的做法是什么?
编辑 :我知道这是可以编写一个查询,如下面的一个cycically民意调查的价值,但我们希望避免这种做法。
SELECT PercentProcessorTime
FROM Win32_PerfFormattedData_PerfProc_Process
WHERE Name = "notepad"