SNMP是任何網管軟件的核心協議,位于OSI(開放系統互連)7層協議的第5層,工作于TCP/UDP協議之上,是NMS(網管系統,即管理主機上運行的網管軟件)與AGENT(代理,即被管理的設備上運行的SNMP服務)之間相互通訊的協議。

圖1 SNMP原理示意圖

圖2 MIB結構示意圖
任何信息設備,只要其支持TCP/IP協議并且運行SNMP服務,都可以納入網絡管理系統進行管理。顯然,信息設備若想加入網管系統,必須啟動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.2 08中。Get得到某個具體的OID值,GetNext是0在Get基礎上得到其下一個值和下一個OID.n,NMS是通過調用SNMP的API函數得到一個或一組OID值,將用戶行為相關OID值顯示在用戶界面。
本程序訪問的OID如下:
正在運行的進程proc ="1.3.6.1.2.1.25.4.2.1.2"
進程的安裝路徑Path ="1.3.6.1.2.1.25.4.2.1.4"(此項可指示應用的安裝目錄)
發光細菌歸屬于微生物范疇,對水體污染物較為敏感,在細菌正常代謝期間,發光強度穩定,持續時間較長,但若受到外部環境的影響,其發光會受到限制,因此,可結合發光抑制率監測水體綜合毒性。以往有研究資料顯示,再生水的原水對發光菌有一定的毒性作用,以工業廢水為主的再生水對發光菌的抑制率約為50.00%。選擇Y城與M城作為研究對象進行發光細菌毒性測試,結果如表1所示。此結果顯示出,二級生物處理可降低污水的毒性,但氯消毒后會增加水毒性。
進程執行的參數para ="1.3.6.1.2.1.25.4.2.1.5"(進程或服務的啟動參數)
安裝的程序名稱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"
計算機系統設備device="1.3.6.1.2.1.25.3.2.1.3"
存儲設備名稱 storage_name="1.3.6.1.2.1.25.2.3.1.3”(包括磁盤、光盤、U盤和內存)
存儲設備分配單 元storage_unit="1.3.6.1.2.1.25.2.3.1.4"(是后面兩項大小的數量單位)
存儲設備大小 storage_size="1.3.6.1.2.1.25.2.3.1.5"
存儲設備占用 storage_used="1.3.6.1.2.1.25.2.3.1.6"
系統上線時間uplink="1.3.6.1.2.1.1.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中提取需要的數據,對數據格式進行轉換,形成需要的格式并顯示在界面中。第四步是關閉會話,釋放資源。
返回的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。
本程序使用VB6開發,程序分單機查詢和多機查詢兩個模塊。
單機模塊可以通過DOS命令調用,格式為show_win

圖4 用戶行為遠程監控單機查詢界面

圖5 多用戶運行程序查詢程序界面

圖6 運行程序掃描結果
多機查詢為Windows程序,只需有一張包含用戶IP地址的excel表格,指定通訊串和IP地址所在表格中的位置,既可對程序名稱進行模糊查詢,界面如圖5所示,查詢結果自動加入IP地址表中,如圖6所示。在圖6中看到的是對多個用戶運行360殺毒軟件(360sd.exe)和騰訊通程序(RTX.exe)的查詢結果,表中顯示哪個用戶運行了(標為“Yes”),哪個用戶沒運行(標為”No”),網不通標為“ping不通”,網通但對方SNMP服務未啟動或通訊串不匹配標為“SNMP錯誤”。顯然,這一功能對于大范圍檢查用戶是否運行規定的程序是非常高效的。
限于篇幅,本文只是給出了程序的編制思路和方法,沒有介紹具體編碼。掌握了這一方法,就可按需要開發各種網管程序,例如,機房溫度的遠程監控就可通過監控交換機的環境溫度實現,也可以通過SNMP Trap監控交換機接口的上線/下線等。