1

我有 ac# 应用程序,它通过 WMI 从远程 Windows 机器收集数据(cpu、ram、hdd 使用情况等)。但现在我还需要监控几个 linux 机器。有没有办法从 Windows 盒子上运行的 c# 应用程序中至少获得 linux 机器的 CPU 和 RAM 利用率?

4

1 回答 1

3

我设法从 linux box 获取指标统计信息。如前所述VirtualBlackFox- 标准化的方式是为此目的使用 snmp。

第一步是在linux上安装snmp。(我在虚拟机上安装了 Ubuntu 12)

这是我用于安装 snmp onetwo的链接。基本上,您需要安装 snmp 守护程序并配置公开指标和网络可见性。

我认为在这一步你可以自由地使用一些 snmp 库从 snmp 设备获取数据,但我也尝试使用WMI-SNMPbridge。

第二步:设置 WMI SNMP 环境

这是您需要执行的步骤列表。

对我来说就足够了

  1. 在 windows 功能中启用 snmp 功能
  2. 在中创建snmp文件夹%windir%\system32\wbem\
  3. 使用此命令Smi2smir /g ..\..\hostmib.mib > hostmib.mof从 MIB 文件生成 MOF 文件
  4. 将 SNMP MOF 文件添加到 WMI 存储库mofcomp hostmib.mof

在此之后,我能够看到 wmi 类和属性

在此处输入图像描述

代码示例

使用Sharpsnmplib

using Lextm.SharpSnmpLib;
using Lextm.SharpSnmpLib.Messaging;

 var result = Messenger.Get(
                    VersionCode.V1,
                    new IPEndPoint(IPAddress.Parse("172.10.206.108"), 161),
                    new OctetString("public"),
                    new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.4.1.2021.4.6.0")) },
                    60000);

这将返回盒子上使用的总内存。(顺便说一句,snmp 的标准端口是 161)

使用 snmp-wmi 网桥

 string snmpClass = "SNMP_RFC1213_MIB_system";
    string path = string.Format("\\\\.\\root\\snmp\\localhost:{0}=@", snmpClass);

    var contextParams = new ManagementNamedValueCollection
    {
                   {"AgentAddress", "172.10.206.108"}, // ip address of snmp device
                   {"AgentReadCommunity", "public"}
    };

    var options = new ObjectGetOptions(contextParams);
    var objSys = new ManagementObject(new ManagementPath(path), options);

    Console.WriteLine(objSys.Properties["sysDescr"].Value);
    Console.ReadLine();

所以至少有两种获取snmp数据的方法:

  1. 使用 OID(对象标识符唯一地标识 MIB 层次结构中的管理对象),如我在第一个示例中所示。这是有用的链接您还可以在 .mof 文件中找到 OID。
  2. 使用 wmi-snmp 网桥。所以我使用了第二个例子中的路径,如果它不适合你,我想你可以在 WMI Explorer 中找到正确的路径。

所以这非常适合它。不知道哪种方法更好或更快。两个都试试看,哪个更适合我的目的。

于 2014-03-05T10:58:56.137 回答