基于SNMP和WMI的网络设备监控管理系统

2016-07-04 06:20张华
企业技术开发·中旬刊 2016年1期

张华

摘 要:网络设备监控系统在保证企业信息化系统稳定运行的过程中起到了至关重要的作用。文章结合windows平台的WMI标准接口和通用的SNMP协议,设计并实现了一个对网络设备实行自动监控及预警的设备监控系统。本系统无需安装客户端,配置简单,使用方便灵活。

关键词:WMI;SNMP;网络设备监控

中图分类号:TP393.07 文献标识码:A 文章编号:1006-8937(2016)02-0060-03

随着企业信息化的深入发展,越来越多的企业购买了大量的网络设备(包括服务器、电脑、交换机等)用以承载自身信息化的建设,随之而来的是多数网络设备由于缺少监控导致业务系统经常中断,不仅影响了企业业务的正常运作,也给维护人员带来了不小的压力;此外,来自不同厂商的网络设备中不可避免地包括各种异构系统平台,给统一监控带来了一定的困难。因此,本文旨在设计并实现一个基于B/S架构的基于SNMP和WMI的网络设备监控系统,基本覆盖各异构网络设备,当设备出现故障或征兆后能及时、自动地向网管人员发出预警。

1 SNMP、WMI概述

SMNP是Simple Network Management Protocol的缩写,意为简单网络管理协议。 SNMP是最早提出的网络管理协议之一,目前已得到了广泛的应用和支持,其中包括IBM、HP、SUN等大公司和厂商。如今SNMP已成为网络管理领域中事实上的工业标准,大多数网络管理系统和平台都是基于SNMP协议的[1]。

WMI(Windows Management Instrumentation,Windows管理规范)是管理Windows设备的一种基础规范和标准方法。Windows系统用户可以借助WMI对本地或远程计算机进行管理,WMI允许通过一系列公共接口访问操作系统各个组件,WMI帮助系统管理员更加高效的完成计算机系统的管理[2][3]。

2 系统设计

2.1 网络设备对象分析

目前在企业信息化系统的实际应用和管理中,存在各种操作系统的服务器和各大厂商的网络互联设备,导致管理困难。本文结合本企业的网络设备现状,设计了一套基于Web的网络设备监控管理系统。本企业多数服务器、PC采用Windows系统,由于微软已将WMI作为系统管理的核心,因此,服务器类设备已基本满足基于WMI组件的数据采集;其次是公司內各种交换器、路由器等设备,为满足该类设备的监控,采用基于SNMP协议进行采集。最终,本文所实现的监控系统将基本覆盖企业内网络设备的监控和管理。

2.2 系统框架设计

通过对基于SNMP协议和WMI组件的研究,设计架构了基于B/S结构的三层网络设备监控管理系统模型,如图1所示,分别是数据采集层、数据处理层和数据展现层。

2.3 系统基本功能

2.3.1 系统配置功能

本系统为适应多种异构系统的数据采集,开放了基于SNMP和WMI两种数据采集模式,用户可根据采集设备能够匹配的数采模式进行设置。一般而言,Windows系统服务器都采用WMI模式,数据的实时性更好;而其他网络设备,本文采用了基于SNMP的采集模式,该模式数据稳定性更好;此外,本模块配置了对所检测网络设备各系统参数(CPU利用率、内存利用率、网络负载、磁盘使用率等)的预警阈值设置,用户可根据日常运行情况对设备预警阈值进行设定,若系统监测到采集数据超过了设定的阈值,可向指定用户发送邮件及短信提醒。

2.3.2 数据采集与处理功能

该功能分别基于SNMP和WMI两种数据获取方式进行采集,根据用户在配置模块中所做设置,自动采集网络设备运行数据并存于SQL Server数据库,通过对数据进行不同的处理以满足如触发报警事件和展现多种形式数据的要求。

2.3.3 数据展现模块功能

该模块主要包含单个网络设备状态查询、所有被采集设备每日数据采样一览、历史监测数据分析等界面;界面主要以图形化形式展示网络设备、服务器等运行情况。

3 系统实现

3.1 实现平台

本系统基于微软.NET平台开发,优势在于基于Windows系统的服务器、PC设备已有成熟的基于.NET的WMI API,开发时只需要引入System.Management命名空间,主要使用到的类为;对于非Windows系统平台的网络设备,本系统引入了目前使用较为广泛且开源的SnmpSharpNet包[4]进行基于SNMP协议的开发。

3.2 软件主要实体类结构及关系

软件所设计实体,如图2所示,Device类作为Router类、Server类和Computer类的抽象父类, 各个具体设备实体类包含获取各设备基本信息的属性或方法。如Server类具有获取各个进程(ProcessStat)和硬盘(DiskStat)信息的相关方法,Router类具有获取网络(NetworkStat)相关信息的方法,这些信息都会包含在具体数据结构中。最后的工具类(WMI+SnmpService)将负责具体连接设备并获取相应指定信息。

3.3 关键技术实现

通过WMI和SNMP方式采集网络设备数据过程比较相似且获取进程数据较为复杂,因此,以下实现关键技术的代码将以获取进程信息为例,获取其他信息可仿照以下代码。

3.3.1 WMI和SNMP连接及执行查询语句代码

①WMI方式:

public ManagementConnectPool(string mpusername, string mppwd, string mpspace, string mpserver)

{

// 初始化wmi连接对象,设置用户名、密码、命名空间、机器地址

System.Management.ConnectionOptions Conn = new Conne

ctio Options();

ManagementObjectSearcher mos = new ManagementObject

Searcher();

this.username = mpusername;

this.pwd = mppwd;

this.space = mpspace;

this.server = mpserver;

Conn.Username = mpusername;

Conn.Password = mppwd;

Conn.Authority = "ntlmdomain:"+ConfigurationManager.App

Settings["domain"];

string scopestring = "//" + mpserver + mpspace;

System.Management.ManagementScope Ms = new Managem

entScope(scopestring);

Ms.Connect();

mos.Scope = Ms;

}

②Snmp方式:

///

/// 通过此方法可以向snmp服务发起一个请求,获取该oid下所有信息

///

public static DictionarygetWalkValue(string host, string community, string irootOid)

{

Dictionary

foreach (ManagementObject mo in moc1)

{

N0 = Decimal.Parse(mo.GetPropertyValue("PercentProcessor

Time").ToString());

D0 = Decimal.Parse(mo.GetPropertyValue("TimeStamp_Sys

100NS").ToString());

break;

}

Thread.Sleep(1000);

ManagementObjectCollection moc2 = mcp.getQueryResult("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" + pid + "'");

foreach (ManagementObject mo in moc2)

{

N1 = Decimal.Parse(mo.GetPropertyValue("PercentProcessor

Time").ToString());

D1 = Decimal.Parse(mo.GetPropertyValue("TimeStamp_Sys

100NS").ToString());

break;

}

cpuUsagePerProcess=((D1 - D0)==0?0:((N1 - N0)/(D1 - D0))*100);

return cpuUsagePerProcess;

}

②Snmp方式: 本文以windows系统的MIB库为例,因此采用了MIB中hrSWRunPerfCPU 的cputime作为计算单个进程cpu占用率的参数。以间隔一定时间分两次获取各进程(hrSWRunPerfCPU:cputime)数据,第一个参数为cputime1,并累加此时cpu总时间为total_cputime1,第二个即为cputime2,cpu总时间为total_cputime2,因此单个进程cpu占用率计算公式为:

[(cputime2 - cputime1)/( total_cputime2- total_cputime1)]x100%,具体计算代码如下:

public ListGetCpuUsagePerProcess(string oid,string community,string hostIp)

{

Decimal cputime1 = 0, cputime2 = 0, total_cputime1=0,total_cputime2=0;

SnmpService snmpService1 = new SnmpNet.SnmpService(community, hostIp);

var result1 = snmpService1.getWalkValue(oid);

List