【问题标题】:Monitoring Bandwith on a remote machine with WMI使用 WMI 监控远程计算机上的带宽
【发布时间】:2021-03-15 02:09:34
【问题描述】:

我正在尝试监控远程 Windows 机器上的接口带宽。到目前为止,我将 SNMP 与Cisco Bandwidth Formula 一起使用,但这需要在两个不同的时间检索两个样本。最后但并非最不重要的一点是,我用 SNMP 记录的值似乎是完全错误的。因为我有 WMI 支持,所以我想使用它,但我发现的唯一值(这似乎是我正在寻找的)是 Win32_PerfRawData_Tcpip_NetworkInterfaceBytesTotalPerSec。然而,该值看起来更像是一个总计数器(就像 SNMP 一样)。有没有办法通过 WMI 检索即时当前带宽?澄清当前带宽字段始终返回 1000000000(这是最大带宽),您可以想象它没有帮助。

【问题讨论】:

  • 您是否尝试通过 WMI 询问 SNMP?然后你可以按照我的解释计算带宽here

标签: c# perl wmi snmp auditing


【解决方案1】:

性能计数器数据在 2 个位置公开,Win32_PerfRawData* 和 Win32_PerfFormattedData*。前者包含原始数据,后者包含派生统计数据,这就是您所追求的。

您通常在 perfmon 中看到的(例如)是 Win32_PerfFormattedData* 数据。

试试这个:

Set objWMI = GetObject("winmgmts://./root\cimv2")
set objRefresher = CreateObject("WbemScripting.Swbemrefresher")
Set objInterfaces = objRefresher.AddEnum(objWMI, _
  "Win32_PerfFormattedData_Tcpip_NetworkInterface").ObjectSet

While (True)
    objRefresher.Refresh
    For each RefreshItem in objRefresher

        For each objInstance in RefreshItem.ObjectSet
            WScript.Echo objInstance.Name & ";" _
              & objInstance.BytesReceivedPersec & ";" _
              & objInstance.BytesSentPersec

        Next

    Next
    Wscript.Echo
    Wscript.Sleep 1000
Wend

根据经验,在给定的一秒内进行测量是毫无用处的,除非你每秒都在收集指标。

如果您想要精确的带宽,您可以通过采集 2 个样本从原始数据中自己获得(无论如何您必须在 Windows 2000 上执行此操作)

如果这更有意义,请参阅此处的 windows 2000 部分。

Derived stats on Windows 2000

这里有一篇很棒的文章Make your own Formatted Performance Data Provider

如果您想深入研究在更长的采样间隔内收集更多统计信息

约翰

【讨论】:

  • 我正在使用您建议的课程,经过几次测试,我可以说注册的值几乎是完美的。但是(是的,不幸的是有一个但是)我怎样才能检索接口索引?我知道 Win32_NetworkAdapter 有一个 Name 值,它应该与 Win32_PerfFormattedData 的 Name 值相同,但你猜怎么着。它们并不相同。例如,我的名字是 Broadcom NetXtreme Gigabit Ethernet _2 和 Broadcom NetXtreme Gigabit Ethernet #2 -.- 我怎样才能加入这两个表?还有其他方法可以检索接口索引吗?
  • 好吧,看来我不是唯一一个遇到这个问题的人,已经有一个类似的问题(很遗憾没有回答):stackoverflow.com/questions/1832586/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多