远程管理用户行为
2017-11-08
应用需求
随着信息系统的广泛应用,一个企业(或一个系统)往往配备成百上千台的计算机,分布于辖区内多个地点,运行着各种应用系统,各计算机之间通过网络实现互联。一般情况下,企业会设置专门机构或人员负责整个信息系统的维护,维护人员除保证各种应用系统正常使用外,为了信息系统的安全运用,也需掌握用户使用行为是否符合规定,主要包括以下问题:
1.用户是否按规定安装了某个软件(例如防病毒软件),是否安装了与工作无关的或明令禁止的软件。
2.用户工作时间是否运行与工作无关的或明令禁止的软件(如使用视频播放软件),要求运行的软件(如用于点对点通讯的软件)是否运行。
3.用户是否按规定下班关机。
4.用户是否违规调换计算机硬件配置(如更换硬盘等)。
显然,这些问题,属于信息系统的管理问题。由于信息设备可能多地分布,也可能是相距遥远,要做好相关的管理工作,往往需要付出大量的人力,且难以保证工作质量和效率。为了解决这一问题,本人利用SNMP(简单网络管理协议),针对Windows应用环境,开发了用户行为远程查询系统,做到对用户行为的动态进行全面监控,大大提高了信息系统管理工作的质量和效率。
SNMP协议简介
SNMP(简单网络管理协议)是任何网管软件的核心协议,位于OSI(开放系统互连)7层协议的第5层,工作于TCP/UDP协议之上,是NMS(网管系统,即管理主机上运行的网管软件)与AGENT(代理,即被管理的设备上运行的SNMP服务)之间相互通讯的协议。Agent端通过一个树形的数据结构MIB(管理信息库)收集设备的配置信息和状态信息,例如设备的接口数量、在线状态、硬盘分区及大小等。每一个信息都有一个对应的MIB节点OID,例如1.3.6.1.2.1.25.4.2.1.2.n代表Windows操作系统中正在运行的进程,n代表第几个进程。当NMS想知道Agent端的进程信息时,就向Agent端发出GET请求,即向对方UDP的161号端口发一个UDP包,包中包含着SNMP版本信息、通行字(相当于口令,在SNMP服务中设置)、查询的节点号等,若无错误,对方就会返回所要查询的节点信息,如1.3.6.1.2.1.25.4.2.1.2.1的值就是第一个进程名称。而节点号的含义可以通过MIB遍历软件得到。
图1 SNMP原理示意图
图2 MIB结构示意图
任何信息设备,只要支持TCP/IP协议并且运行SNMP服务,都可以纳入网络管理系统进行管理,例如交换机、服务器、网络打印机、空调、UPS等。显然,信息设备若想加入网管系统,必须启动SNMP服务,设定通行字,并使之可被访问。SNMP原理参如图1、图2所示。
实现原理
通过前面的介绍可知,开发用户行为远程监控程序,就是开发管理端的NMS,而被监控计算机需要运行Agent程序(SNMP服务),并设置通行字。如图2所示,被监控主机为10.19.138.69,通行字为public(可任意设定,系统缺省为 public),RTX.exe(腾讯通)的 OID为1.3.6.1.2.1.25.4.2.1.2,例程号n为208。需要说明的是,SNMP是Windows系统的一个组件,若没有被安装,应该安装“管理和监视工具”中的“简单网络管理协议”,安装后,需设置通行字,SNMP服务会自动启动。
得到OID内容的方法有两种,一个是Get方法,一个是GetNext方法。两种方法都是按照OID.n的参数访问具体的值,例如上述腾讯通TRX.exe进程名称存储在1.3.6.1.2.1.25.4.2.1.2.208中。Get得到某个具体的OID值,GetNext是在Get基础上得到其下一个值和下一个OID.n,NMS就是通过调用SNMP的API函数得到一个或一组OID值,将用户行为相关的OID值显示在用户界面。
实现方法
1.首先,通过snmpWalk等软件确定所需要的OID。
本程序访问的OID如下:
图3 程序流程图
图4 用户行为远程监控单机查询界面
2.通过wsnmp32.dll动态链接库访问Agent,程序流程见图3。
要完成从Agent得到OID.n的内容,需要四个步骤,第一步是建立对话,设置SNMP版本,启动API,得到句柄,为后续操作做准备。第二步是对连接参数的格式进行转换,根据不同的操作类型,形成对应的PDU并发给 Agent,Agent端 若 启 动了SNMP服务,就会响应这一请求,若与指定的通讯串匹配,ODI在Agent端的MIB中也存在,就会返回请求的数据。而若有一项不符合条件,就会返回错误。例如,本机192.168.1.1向192.168.1.2发出请求,SNMP通讯串为public,版本号为 V1,超时timeout=2秒,需访问的OID= "1.3.6.1.2.1.1.3.0"(系统上线时间),把以上信息的格式通过转换,连同操作类型Get一起形成PDU发出,就可以得到字符串型的时间数据。特别的,若需要得到一组数据(如所有的进程)时,第一个操作应该是Get,后续的操作为GetNext,并应依据返回的OID判断何处是本组数据的最后一个。第三步是处理Agent返回的数据,得到PDU,从PDU中提取需要的数据,对数据格式进行转换,形成需要的格式并显示在界面中。第四步是关闭会话,释放资源。
3.返回数据的处理。返回的PDU中的数据,无论是字符型还是(长)整型,都以占用字节数确定长度,正常情况下,取出的数据存在字符型数组中,字符串型数据可以直接使用,例如程序名称,长整型数据转换后也可以直接使用。但是,长整型数据取出到字符型数组有时会发生问题,取出后导致长度会发生改变,数据发生错误。经分析发现,当长整型数据的内码(16进制序列)中含有大于等于“A0”的字节时就会导致错误,例如程序名OID=.1.3.6.1.2.1.25.6.3.1.5.1,Type=OctetString,Value= 07 E0 0C 1A 0E 07 3A 00,而大于“A0”的字节是汉字区位码的标志,不知wsnmp32.ddl是否因此导致了错误,总之,这或许是个Bug。
4.程序功能。本程序使用VB6开发,程序分单机查询和多机查询两个模块。
图5 多用户运行程序查询程序界面
图6 运行程序扫描结果
单机模块可以通过DOS命令调用,格式为show_win
多机查询为Windows程序,只需要有一张包含用户IP地址的Excel表格,指定通讯串和IP地址所在表格中的位置,既可以对程序名称进行模糊查询,界面如图5所示,查询结果自动加入IP地址表中(如图6)。在图6中看到的是对多个用户运行360杀毒软件(360sd.exe)和腾讯通程序(RTX.exe)的查询结果,表中显示哪个用户运行了(标为“Yes”),哪个用户没运行(标为”No”),网不通标为“Ping不通”,网通但对方SNMP服务未启动或通讯串不匹配标为“SNMP错误”。显然,这一功能对于大范围检查用户是否运行规定的程序是非常高效的。
结束语
限于篇幅,本文只是给出了程序的编制思路和方法,没有介绍具体编码,有关知识也只介绍了需要的部分。掌握了这一方法,就可以按需要开发各种网管程序,例如,机房温度的远程监控就可以通过监控交换机的环境温度实现,也可以通过SNMP Trap监控交换机接口的上线/下线等,进而大大提高信息系统的维护和管理水平。