隨著信息系統的廣泛應用,一個企業(或一個系統)往往配備成百上千臺的計算機,分布于轄區內多個地點,運行著各種應用系統,各計算機之間通過網絡實現互聯。一般情況下,企業會設置專門機構或人員負責整個信息系統的維護,維護人員除保證各種應用系統正常使用外,為了信息系統的安全運用,也需掌握用戶使用行為是否符合規定,主要包括以下問題:
1.用戶是否按規定安裝了某個軟件(例如防病毒軟件),是否安裝了與工作無關的或明令禁止的軟件。
2.用戶工作時間是否運行與工作無關的或明令禁止的軟件(如使用視頻播放軟件),要求運行的軟件(如用于點對點通訊的軟件)是否運行。
3.用戶是否按規定下班關機。
4.用戶是否違規調換計算機硬件配置(如更換硬盤等)。
顯然,這些問題,屬于信息系統的管理問題。由于信息設備可能多地分布,也可能是相距遙遠,要做好相關的管理工作,往往需要付出大量的人力,且難以保證工作質量和效率。為了解決這一問題,本人利用SNMP(簡單網絡管理協議),針對Windows應用環境,開發了用戶行為遠程查詢系統,做到對用戶行為的動態進行全面監控,大大提高了信息系統管理工作的質量和效率。
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監控交換機接口的上線/下線等,進而大大提高信息系統的維護和管理水平。