【发布时间】:2009-07-21 22:41:26
【问题描述】:
我正在尝试构建一个可以通过 WMI 监控多台远程计算机的应用程序。作为一名 C# 开发人员,我选择使用 System.Management 命名空间。
出于性能和可扩展性的原因,我更喜欢使用事件驱动的方法来收集信息,而不是基于轮询的方法。因此,我一直在研究 ManagementEventWatcher 类。
对于简单的监控任务,这个类似乎正是我想要的。我创建对象,为其提供 ManagementScope、EventQuery 和 EventWatcherOptions 参数,订阅 EventArrived 事件,并调用 Start 方法(下面的简化示例)。
using SM = System.Management;
...
SM.ManagementEventWatcher _watcher;
SM.ConnectionOptions conxOptions;
SM.ManagementScope scope;
SM.WqlEventQuery eventQuery;
SM.EventWatcherOptions eventOptions;
SM.EventArrivedEventHandler handler;
string path = @"\\machine\root\cimv2";
conxOptions = new SM.ConnectionOptions ();
conxOptions.Username = user;
conxOptions.Password = password;
scope = new SM.ManagementScope (path, conxOptions);
scope.Connect ();
eventQuery = new SM.WqlEventQuery ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'");
eventOptions = new SM.EventWatcherOptions ();
eventOptions.Context.Add ("QueryName", "Process Query");
_watcher = new SM.ManagementEventWatcher (scope, eventQuery, eventOptions);
handler = new SM.EventArrivedEventHandler (HandleWMIEvent);
_watcher.EventArrived += handler;
_watcher.Start ();
Console.WriteLine ("Press Any Key To Continue");
Console.ReadKey ();
_watcher.Stop ();
_watcher.EventArrived -= handler;
我遇到的问题是很难检测到远程机器的连接何时已通过各种方式(机器重启、路由器故障、网线拔出等)中断。
ManagementEventWatcher 类似乎没有提供任何确定连接已丢失的方法,因为发生这种情况时不会触发 Stopped 事件。尽管链接断开,附加到 ManagementEventWatcher 的 ManagementScope 对象仍将 IsConnected 显示为 true。
有人对如何检查连接状态有任何想法吗?
此时我唯一能想到的就是使用 ManagementScope 对象定期对机器执行 WMI 查询并确保它仍然有效,尽管这只能检查本地->远程连接而不是对应的远程->本地连接。我想我可以查找另一个可以用来验证连接的 WMI 查询(假设查询有效),但这似乎比我应该做的工作更多。
【问题讨论】:
标签: c# .net wmi monitoring