隨著信息系統(tǒng)的廣泛應(yīng)用,一個(gè)企業(yè)(或一個(gè)系統(tǒng))往往配備成百上千臺(tái)的計(jì)算機(jī),分布于轄區(qū)內(nèi)多個(gè)地點(diǎn),運(yùn)行著各種應(yīng)用系統(tǒng),各計(jì)算機(jī)之間通過網(wǎng)絡(luò)實(shí)現(xiàn)互聯(lián)。一般情況下,企業(yè)會(huì)設(shè)置專門機(jī)構(gòu)或人員負(fù)責(zé)整個(gè)信息系統(tǒng)的維護(hù),維護(hù)人員除保證各種應(yīng)用系統(tǒng)正常使用外,為了信息系統(tǒng)的安全運(yùn)用,也需掌握用戶使用行為是否符合規(guī)定,主要包括以下問題:
1.用戶是否按規(guī)定安裝了某個(gè)軟件(例如防病毒軟件),是否安裝了與工作無關(guān)的或明令禁止的軟件。
2.用戶工作時(shí)間是否運(yùn)行與工作無關(guān)的或明令禁止的軟件(如使用視頻播放軟件),要求運(yùn)行的軟件(如用于點(diǎn)對(duì)點(diǎn)通訊的軟件)是否運(yùn)行。
3.用戶是否按規(guī)定下班關(guān)機(jī)。
4.用戶是否違規(guī)調(diào)換計(jì)算機(jī)硬件配置(如更換硬盤等)。
顯然,這些問題,屬于信息系統(tǒng)的管理問題。由于信息設(shè)備可能多地分布,也可能是相距遙遠(yuǎn),要做好相關(guān)的管理工作,往往需要付出大量的人力,且難以保證工作質(zhì)量和效率。為了解決這一問題,本人利用SNMP(簡單網(wǎng)絡(luò)管理協(xié)議),針對(duì)Windows應(yīng)用環(huán)境,開發(fā)了用戶行為遠(yuǎn)程查詢系統(tǒng),做到對(duì)用戶行為的動(dòng)態(tài)進(jìn)行全面監(jiān)控,大大提高了信息系統(tǒng)管理工作的質(zhì)量和效率。
SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)是任何網(wǎng)管軟件的核心協(xié)議,位于OSI(開放系統(tǒng)互連)7層協(xié)議的第5層,工作于TCP/UDP協(xié)議之上,是NMS(網(wǎng)管系統(tǒng),即管理主機(jī)上運(yùn)行的網(wǎng)管軟件)與AGENT(代理,即被管理的設(shè)備上運(yùn)行的SNMP服務(wù))之間相互通訊的協(xié)議。Agent端通過一個(gè)樹形的數(shù)據(jù)結(jié)構(gòu)MIB(管理信息庫)收集設(shè)備的配置信息和狀態(tài)信息,例如設(shè)備的接口數(shù)量、在線狀態(tài)、硬盤分區(qū)及大小等。每一個(gè)信息都有一個(gè)對(duì)應(yīng)的MIB節(jié)點(diǎn)OID,例如1.3.6.1.2.1.25.4.2.1.2.n代表Windows操作系統(tǒng)中正在運(yùn)行的進(jìn)程,n代表第幾個(gè)進(jìn)程。當(dāng)NMS想知道Agent端的進(jìn)程信息時(shí),就向Agent端發(fā)出GET請(qǐng)求,即向?qū)Ψ経DP的161號(hào)端口發(fā)一個(gè)UDP包,包中包含著SNMP版本信息、通行字(相當(dāng)于口令,在SNMP服務(wù)中設(shè)置)、查詢的節(jié)點(diǎn)號(hào)等,若無錯(cuò)誤,對(duì)方就會(huì)返回所要查詢的節(jié)點(diǎn)信息,如1.3.6.1.2.1.25.4.2.1.2.1的值就是第一個(gè)進(jìn)程名稱。而節(jié)點(diǎn)號(hào)的含義可以通過MIB遍歷軟件得到。
圖1 SNMP原理示意圖
圖2 MIB結(jié)構(gòu)示意圖
任何信息設(shè)備,只要支持TCP/IP協(xié)議并且運(yùn)行SNMP服務(wù),都可以納入網(wǎng)絡(luò)管理系統(tǒng)進(jìn)行管理,例如交換機(jī)、服務(wù)器、網(wǎng)絡(luò)打印機(jī)、空調(diào)、UPS等。顯然,信息設(shè)備若想加入網(wǎng)管系統(tǒng),必須啟動(dòng)SNMP服務(wù),設(shè)定通行字,并使之可被訪問。SNMP原理參如圖1、圖2所示。
通過前面的介紹可知,開發(fā)用戶行為遠(yuǎn)程監(jiān)控程序,就是開發(fā)管理端的NMS,而被監(jiān)控計(jì)算機(jī)需要運(yùn)行Agent程序(SNMP服務(wù)),并設(shè)置通行字。如圖2所示,被監(jiān)控主機(jī)為10.19.138.69,通行字為public(可任意設(shè)定,系統(tǒng)缺省為 public),RTX.exe(騰訊通)的 OID為1.3.6.1.2.1.25.4.2.1.2,例程號(hào)n為208。需要說明的是,SNMP是Windows系統(tǒng)的一個(gè)組件,若沒有被安裝,應(yīng)該安裝“管理和監(jiān)視工具”中的“簡單網(wǎng)絡(luò)管理協(xié)議”,安裝后,需設(shè)置通行字,SNMP服務(wù)會(huì)自動(dòng)啟動(dòng)。
得到OID內(nèi)容的方法有兩種,一個(gè)是Get方法,一個(gè)是GetNext方法。兩種方法都是按照OID.n的參數(shù)訪問具體的值,例如上述騰訊通TRX.exe進(jìn)程名稱存儲(chǔ)在1.3.6.1.2.1.25.4.2.1.2.208中。Get得到某個(gè)具體的OID值,GetNext是在Get基礎(chǔ)上得到其下一個(gè)值和下一個(gè)OID.n,NMS就是通過調(diào)用SNMP的API函數(shù)得到一個(gè)或一組OID值,將用戶行為相關(guān)的OID值顯示在用戶界面。
1.首先,通過snmpWalk等軟件確定所需要的OID。
本程序訪問的OID如下:
圖3 程序流程圖
圖4 用戶行為遠(yuǎn)程監(jiān)控單機(jī)查詢界面
2.通過wsnmp32.dll動(dòng)態(tài)鏈接庫訪問Agent,程序流程見圖3。
要完成從Agent得到OID.n的內(nèi)容,需要四個(gè)步驟,第一步是建立對(duì)話,設(shè)置SNMP版本,啟動(dòng)API,得到句柄,為后續(xù)操作做準(zhǔn)備。第二步是對(duì)連接參數(shù)的格式進(jìn)行轉(zhuǎn)換,根據(jù)不同的操作類型,形成對(duì)應(yīng)的PDU并發(fā)給 Agent,Agent端 若 啟 動(dòng)了SNMP服務(wù),就會(huì)響應(yīng)這一請(qǐng)求,若與指定的通訊串匹配,ODI在Agent端的MIB中也存在,就會(huì)返回請(qǐng)求的數(shù)據(jù)。而若有一項(xiàng)不符合條件,就會(huì)返回錯(cuò)誤。例如,本機(jī)192.168.1.1向192.168.1.2發(fā)出請(qǐng)求,SNMP通訊串為public,版本號(hào)為 V1,超時(shí)timeout=2秒,需訪問的OID= "1.3.6.1.2.1.1.3.0"(系統(tǒng)上線時(shí)間),把以上信息的格式通過轉(zhuǎn)換,連同操作類型Get一起形成PDU發(fā)出,就可以得到字符串型的時(shí)間數(shù)據(jù)。特別的,若需要得到一組數(shù)據(jù)(如所有的進(jìn)程)時(shí),第一個(gè)操作應(yīng)該是Get,后續(xù)的操作為GetNext,并應(yīng)依據(jù)返回的OID判斷何處是本組數(shù)據(jù)的最后一個(gè)。第三步是處理Agent返回的數(shù)據(jù),得到PDU,從PDU中提取需要的數(shù)據(jù),對(duì)數(shù)據(jù)格式進(jìn)行轉(zhuǎn)換,形成需要的格式并顯示在界面中。第四步是關(guān)閉會(huì)話,釋放資源。
3.返回?cái)?shù)據(jù)的處理。返回的PDU中的數(shù)據(jù),無論是字符型還是(長)整型,都以占用字節(jié)數(shù)確定長度,正常情況下,取出的數(shù)據(jù)存在字符型數(shù)組中,字符串型數(shù)據(jù)可以直接使用,例如程序名稱,長整型數(shù)據(jù)轉(zhuǎn)換后也可以直接使用。但是,長整型數(shù)據(jù)取出到字符型數(shù)組有時(shí)會(huì)發(fā)生問題,取出后導(dǎo)致長度會(huì)發(fā)生改變,數(shù)據(jù)發(fā)生錯(cuò)誤。經(jīng)分析發(fā)現(xiàn),當(dāng)長整型數(shù)據(jù)的內(nèi)碼(16進(jìn)制序列)中含有大于等于“A0”的字節(jié)時(shí)就會(huì)導(dǎo)致錯(cuò)誤,例如程序名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”的字節(jié)是漢字區(qū)位碼的標(biāo)志,不知wsnmp32.ddl是否因此導(dǎo)致了錯(cuò)誤,總之,這或許是個(gè)Bug。
4.程序功能。本程序使用VB6開發(fā),程序分單機(jī)查詢和多機(jī)查詢兩個(gè)模塊。
圖5 多用戶運(yùn)行程序查詢程序界面
圖6 運(yùn)行程序掃描結(jié)果
單機(jī)模塊可以通過DOS命令調(diào)用,格式為show_win
多機(jī)查詢?yōu)閃indows程序,只需要有一張包含用戶IP地址的Excel表格,指定通訊串和IP地址所在表格中的位置,既可以對(duì)程序名稱進(jìn)行模糊查詢,界面如圖5所示,查詢結(jié)果自動(dòng)加入IP地址表中(如圖6)。在圖6中看到的是對(duì)多個(gè)用戶運(yùn)行360殺毒軟件(360sd.exe)和騰訊通程序(RTX.exe)的查詢結(jié)果,表中顯示哪個(gè)用戶運(yùn)行了(標(biāo)為“Yes”),哪個(gè)用戶沒運(yùn)行(標(biāo)為”No”),網(wǎng)不通標(biāo)為“Ping不通”,網(wǎng)通但對(duì)方SNMP服務(wù)未啟動(dòng)或通訊串不匹配標(biāo)為“SNMP錯(cuò)誤”。顯然,這一功能對(duì)于大范圍檢查用戶是否運(yùn)行規(guī)定的程序是非常高效的。
限于篇幅,本文只是給出了程序的編制思路和方法,沒有介紹具體編碼,有關(guān)知識(shí)也只介紹了需要的部分。掌握了這一方法,就可以按需要開發(fā)各種網(wǎng)管程序,例如,機(jī)房溫度的遠(yuǎn)程監(jiān)控就可以通過監(jiān)控交換機(jī)的環(huán)境溫度實(shí)現(xiàn),也可以通過SNMP Trap監(jiān)控交換機(jī)接口的上線/下線等,進(jìn)而大大提高信息系統(tǒng)的維護(hù)和管理水平。