1

我们正在为我们的系统设计一个监控解决方案,并且我们正在研究 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 吗?实现我们想要的最佳实践是什么?

编辑:我知道可以编写如下查询并循环轮询该值,但是我们希望避免这种方法。

 SELECT PercentProcessorTime 
 FROM Win32_PerfFormattedData_PerfProc_Process 
 WHERE Name = "notepad"
4

1 回答 1

3

具有对前一个实例的__InstanceModificationEvent引用,因此您可以比较PreviousInstance和之间的值TargetInstance。例如,要过滤 PercentProcessorTime 更改:

var query =   "SELECT * "
            + "FROM __InstanceModificationEvent "
            + "WITHIN 1 "
            + "WHERE TargetInstance Isa \"Win32_PerfFormattedData_PerfProc_Process\" "
            + "AND TargetInstance.Name = \"notepad\" "
            + "AND PreviousInstance.PercentProcessorTime != TargetInstance.PercentProcessorTime ";
于 2013-06-09T22:55:00.773 回答