我有 ac# 应用程序,它通过 WMI 从远程 Windows 机器收集数据(cpu、ram、hdd 使用情况等)。但现在我还需要监控几个 linux 机器。有没有办法从 Windows 盒子上运行的 c# 应用程序中至少获得 linux 机器的 CPU 和 RAM 利用率?
问问题
2219 次
1 回答
3
我设法从 linux box 获取指标统计信息。如前所述VirtualBlackFox
- 标准化的方式是为此目的使用 snmp。
第一步是在linux上安装snmp。(我在虚拟机上安装了 Ubuntu 12)
这是我用于安装 snmp one和two的链接。基本上,您需要安装 snmp 守护程序并配置公开指标和网络可见性。
我认为在这一步你可以自由地使用一些 snmp 库从 snmp 设备获取数据,但我也尝试使用WMI-SNMP
bridge。
第二步:设置 WMI SNMP 环境
这是您需要执行的步骤列表。
对我来说就足够了
- 在 windows 功能中启用 snmp 功能
- 在中创建
snmp
文件夹%windir%\system32\wbem\
- 使用此命令
Smi2smir /g ..\..\hostmib.mib > hostmib.mof
从 MIB 文件生成 MOF 文件 - 将 SNMP MOF 文件添加到 WMI 存储库
mofcomp hostmib.mof
在此之后,我能够看到 wmi 类和属性
代码示例
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数据的方法:
- 使用 OID(对象标识符唯一地标识 MIB 层次结构中的管理对象),如我在第一个示例中所示。这是有用的链接。您还可以在 .mof 文件中找到 OID。
- 使用 wmi-snmp 网桥。所以我使用了第二个例子中的路径,如果它不适合你,我想你可以在 WMI Explorer 中找到正确的路径。
所以这非常适合它。不知道哪种方法更好或更快。两个都试试看,哪个更适合我的目的。
于 2014-03-05T10:58:56.137 回答