SNMP是任何網(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é)議。
圖1 SNMP原理示意圖
圖2 MIB結(jié)構(gòu)示意圖
任何信息設(shè)備,只要其支持TCP/IP協(xié)議并且運(yùn)行SNMP服務(wù),都可以納入網(wǎng)絡(luò)管理系統(tǒng)進(jìn)行管理。顯然,信息設(shè)備若想加入網(wǎng)管系統(tǒng),必須啟動(dòng)SNMP服務(wù),設(shè)定通行字,并使之可被訪問(wèn)。SNMP原理參見(jiàn)圖1,圖2。
通過(guò)前面的介紹可知,開發(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。
說(shuō) 明:SNMP是 Windows系統(tǒng)的一個(gè)組件,若沒(méi)有被安裝,應(yīng)安裝“管理和監(jiān)視工具”中的“簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議”,安裝后,需設(shè)置通行字,SNMP服務(wù)會(huì)自動(dòng)啟動(dòng)。
得到OID內(nèi)容的方法有兩種,一是Get方法,二是GetNext方法。兩種方法是按照OID.n的參數(shù)訪問(wèn)具體值,如上述騰訊通TRX.exe進(jìn)程名稱存儲(chǔ)在1.3.6.1.2.1.25.4.2.1.2.2 08中。Get得到某個(gè)具體的OID值,GetNext是0在Get基礎(chǔ)上得到其下一個(gè)值和下一個(gè)OID.n,NMS是通過(guò)調(diào)用SNMP的API函數(shù)得到一個(gè)或一組OID值,將用戶行為相關(guān)OID值顯示在用戶界面。
本程序訪問(wèn)的OID如下:
正在運(yùn)行的進(jìn)程proc ="1.3.6.1.2.1.25.4.2.1.2"
進(jìn)程的安裝路徑Path ="1.3.6.1.2.1.25.4.2.1.4"(此項(xiàng)可指示應(yīng)用的安裝目錄)
發(fā)光細(xì)菌歸屬于微生物范疇,對(duì)水體污染物較為敏感,在細(xì)菌正常代謝期間,發(fā)光強(qiáng)度穩(wěn)定,持續(xù)時(shí)間較長(zhǎng),但若受到外部環(huán)境的影響,其發(fā)光會(huì)受到限制,因此,可結(jié)合發(fā)光抑制率監(jiān)測(cè)水體綜合毒性。以往有研究資料顯示,再生水的原水對(duì)發(fā)光菌有一定的毒性作用,以工業(yè)廢水為主的再生水對(duì)發(fā)光菌的抑制率約為50.00%。選擇Y城與M城作為研究對(duì)象進(jìn)行發(fā)光細(xì)菌毒性測(cè)試,結(jié)果如表1所示。此結(jié)果顯示出,二級(jí)生物處理可降低污水的毒性,但氯消毒后會(huì)增加水毒性。
進(jìn)程執(zhí)行的參數(shù)para ="1.3.6.1.2.1.25.4.2.1.5"(進(jìn)程或服務(wù)的啟動(dòng)參數(shù))
安裝的程序名稱prog ="1.3.6.1.2.1.25.6.3.1.2"
程序的安裝日 期date_time="1.3.6.1.2.1.25.6.3.1.5"
計(jì)算機(jī)系統(tǒng)設(shè)備device="1.3.6.1.2.1.25.3.2.1.3"
存儲(chǔ)設(shè)備名稱 storage_name="1.3.6.1.2.1.25.2.3.1.3”(包括磁盤、光盤、U盤和內(nèi)存)
存儲(chǔ)設(shè)備分配單 元storage_unit="1.3.6.1.2.1.25.2.3.1.4"(是后面兩項(xiàng)大小的數(shù)量單位)
存儲(chǔ)設(shè)備大小 storage_size="1.3.6.1.2.1.25.2.3.1.5"
存儲(chǔ)設(shè)備占用 storage_used="1.3.6.1.2.1.25.2.3.1.6"
系統(tǒng)上線時(shí)間uplink="1.3.6.1.2.1.1.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秒,需訪問(wèn)的OID="1.3.6.1.2.1.1.3.0"(系統(tǒng)上線時(shí)間),把以上信息的格式通過(guò)轉(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ì)話,釋放資源。
返回的PDU中的數(shù)據(jù),無(wú)論是字符型還是(長(zhǎng))整型,都以占用字節(jié)數(shù)確定長(zhǎng)度。正常情況下,取出的數(shù)據(jù)存在字符型數(shù)組中,字符串型數(shù)據(jù)可直接使用。例如,程序名稱,長(zhǎng)整型數(shù)據(jù)轉(zhuǎn)換后也可直接使用。但是,長(zhǎng)整型數(shù)據(jù)取出到字符型數(shù)組有時(shí)會(huì)發(fā)生問(wèn)題,取出后導(dǎo)致長(zhǎng)度會(huì)發(fā)生改變,數(shù)據(jù)發(fā)生錯(cuò)誤。
經(jīng)分析發(fā)現(xiàn),當(dāng)長(zhǎ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。
本程序使用VB6開發(fā),程序分單機(jī)查詢和多機(jī)查詢兩個(gè)模塊。
單機(jī)模塊可以通過(guò)DOS命令調(diào)用,格式為show_win
圖4 用戶行為遠(yuǎn)程監(jiān)控單機(jī)查詢界面
圖5 多用戶運(yùn)行程序查詢程序界面
圖6 運(yùn)行程序掃描結(jié)果
多機(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è)用戶沒(méi)運(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ī)定的程序是非常高效的。
限于篇幅,本文只是給出了程序的編制思路和方法,沒(méi)有介紹具體編碼。掌握了這一方法,就可按需要開發(fā)各種網(wǎng)管程序,例如,機(jī)房溫度的遠(yuǎn)程監(jiān)控就可通過(guò)監(jiān)控交換機(jī)的環(huán)境溫度實(shí)現(xiàn),也可以通過(guò)SNMP Trap監(jiān)控交換機(jī)接口的上線/下線等。