代曉峰
(中國醫藥集團聯合工程有限公司,湖北 武漢 430077)
21世紀,計算機技術快速發展,信息化建設不斷更新,局域網更新迭代并深入到更多領域中,但存在一個較為嚴重的問題,即網絡管理。雖然很多木馬程序或者遠程軟件可以實現局域網電腦屏幕的監控,但是木馬屬于病毒,企業或學校等機構的電腦上都存在一些較為機密的文件等,因此利用木馬監控不可取。
遠程桌面集體監控系統通常由兩部分組成,一部分是主控端程序,另一部分是被控端程序。主控端程序安裝于客戶的電腦中,被控端程序安裝于被控電腦中。被控端需要接收主控端的命令,并定期將信息發送到主控端的桌面中,使用者就可以通過自己的電腦來監控被控端的電腦。
基于Qt的遠程桌面集體監控系統在運行時,首先需要啟動查看監控的計算機,并啟動需要的用戶數據報協議(User Datagram Protocol,UDP)端口,繼而輸入對應的命令進行讀取。在該計算機成功鏈接到所需要監控的計算機端時,將會采用屏幕錄制投影的方式不斷傳輸計算機桌面的數據,進而可以讓管理者通過用于監控的計算機進行投影查看[1]。
該系統設計方案是使用Qt搭建客戶機/服務器(Client/Server,C/S)框架,主要運用 Qt中的QUdpSocket類來實現UDP協議的編程,用Qt中的QTcpSocket類和QTcpServer類來實現傳輸控制協議(Transmission Control Protocol,TCP)的編程,運行中利用監視器將命令發送到被監視器配置的UDP端口[2]。該命令是控制命令,如果Monitor聽到此UDP命令,它將打開TCP端口將連接請求發送出去,從而建立起獨特的遠程服務系統。監控終端會在遠程控制功能的基礎上發送遠程控制指令,控制被監控終端的各應用程序。
消息輸入、命令處理結果顯示模塊以及通信模塊包含在監控終端。把用戶界面所發生的事件實時傳輸到通信模塊,這是消息輸入模塊負責的內容,然后通信模塊再把實時的指令內容傳送到被監控終端,由被監控終端執行操作后再將返回的成功或失敗信息交給監控終端命令顯示模塊,根據信息的具體格式顯示結果。
通信模塊和命令處理模塊包含在被監控端內。由于被監控端一直處于偵聽的狀態,因此當正常合法的連接請求被接收到時,被監控端就會打開UDP端口,然后及時打開命令接收線程。在順利建立連接后,由被監控端發來的實時命令信息會由被監控端的通信模塊進行接收,再由被監控端的命令處理模塊進行處理,最后實時把結果發送回監控終端[3]。
把客戶端的程序安裝到被監控端后,當程序運行時,UDP端口會被系統打開,若遭到相關防火程序和殺毒程序的制止,系統就會再去打開配置另外的UDP端口。如果都沒能成功打開,就會導致啟動的失敗。相反,若成功打開相關端口,那么被打開的UDP會被系統按字傳輸,進一步打開命令接收線程,獲得命令,同時處理一些得到的命令。此后,在啟動項中把程序復制過去,并且把名字替換成Explorer.jar。
在將服務程序成功安裝到監控終端后,首先被監控終端控制并啟動運行的是窗口類,顯示初始化圖形,等待操作者輸入IP地址。任意一個TCP端口會被監控終端開啟并運行,再將初始化命令(格式為ordername:port)發送到使用者所輸入IP地址配置的UDP端口中,其中ordername是命令名字,port是監控終端所要打開的TCP端口號[4]。監控終端會監聽已經打開并運行的TCP端口,若超過連接時間,則會導致連接不成功。
當運行被監控終端的UDP端口后,系統開始監聽被監控終端的UDP接口,若有相關命令就會被迅速讀取,同時對命令的有效性進行判斷,命令的格式為ordername: port。若是無效命令,系統就會重新回到端口繼續讀取命令;若是有效命令,則相對應的命令處理板塊就會被選調去處理命令,將處理結束的命令結果發送到監控終端。
監視方將打開任何TCP端口,將UDP命令通過TCP端口發送到被監視方的UDP端口。如果在規定的時間內響應,則讀取需要的圖像流并顯示,沒有在規定的時間內響應則提示“連接命令執行失敗”。
當被監視方收到監視方的UDP命令(控制:TCP端口)時,被監視方將獲得監視方開放的TCP的端口號[5]。被監視方使用這個端口號連接到監視器側的TCP端口,從TCP端口讀取事件對象。如果是一個鍵盤事件,則從鍵盤重復該事件;如果是一個鼠標事件,則從鼠標重復該事件。如果連接斷開,則控件終止;如果沒有,則返回閱讀事件。
系統使用Qt搭建客戶機/服務器的總體結構,其分為服務器端和客戶端程序。為確保從操作員終端到被操作終端的遠程控制,必須在客戶端和客戶端之建立通信Socket(套接字)。進入監視狀態,由客戶機套接字發送連接請求,一旦服務器接收到請求,它就會設置另一條套接字來用于通信。如果一個客戶端通過發送連接請求,在另一端進行建立,那么客戶端和服務器之間的連接將變得更加靈活。如果客戶機定期向服務器發送命令,服務器將接收屏幕圖像,并進行壓縮后發送給客戶端。為了控制服務器,客戶機接收信息并在監視窗口中顯示服務器發送的圖像。客戶機響應鍵盤和鼠標事件并記錄這些事件,同時在消息命令中存儲各種信息[6]。客戶端通過傳輸控制協議/網際協議(Transmission Control Protocol / Internet Protocol,TCP/IP)將事件信息發送給服務器端,轉換為與屏幕對應的鍵盤、鼠標事件,從而實現遠程監控。當客戶端請求控制服務器上的硬盤數據文件時,直接響應文件操作請求。系統的工作流程如圖1所示。

圖1 系統工作流程
通過服務器IP連接實現遠程桌面監控。本文通過Qt平臺建立通信,支持多種協議,包括面向連接的流套接字和無連接的數據報套接字。在實施監控時,被控端需要將其桌面圖像相關數據發送到主控制端,而圖像數據往往較大。在實現遠程桌面監控時,需要向被控端發送消息,告知被控端要執行何種操作,而這種消息對精度有更高的要求。綜合考慮,選擇了面向連接的模式,也就是流式套接字來進行網絡通信,可以提供有序、穩定的雙向數據通信。客戶端程序界面如圖2所示。

圖2 客戶端程序界面
主窗體的部分中,包括顯示主窗體界面和進行窗口信息的處理,主要是與主窗體建立刷新、調整大小、時間顯示和獲取端口等有關的函數,下面列出窗口建立部分函數:

一旦服務器接收到客戶機的計算機連接,就會創建一個Socket對象。當收到客戶請求,成功創建客戶端通信接口后便可以進行TCP/IP應用程序的相互通信,通信流程如圖3所示。

圖3 網絡通信的流程
連接后,必須處理傳輸數據的內容和格式,如安裝初始化服務器的屏幕網程序。發送命令的方法有兩種,一種是更新桌面上顯示的信息,另一種是提供不同的命令服務器。客戶端有關網絡的代碼為:

控件終端用戶單擊屏幕監控,彈出監控界面。在控制端監控窗口中,實時顯示被控端的桌面屏幕,反映桌面屏幕的變化,可以通過鼠標鍵盤在監控窗口中操作被控端的桌面屏幕,如同在遠端計算機前操作一樣[7]。流程如圖4所示,屏幕監控代碼中的關鍵函數如下:


圖4 屏幕監控流程
根據服務器端捕獲桌面屏幕的步驟,獲取到的屏幕桌面需要在進行壓縮后才能進行傳輸,客戶端在接收到這些位圖信息后,還要進行相應的解碼,才能顯示出被控制端的桌面屏幕。獲取的屏幕信息代碼為:


客戶接收到圖像數據,首先將其解壓縮為BMP文件格式,然后再將其變為DIB格式。此外,可以直接顯示DIB,也可以把DIB轉換為DDB后顯示DDB。
為了在客戶端界面中顯示屏幕窗口,屏幕需要縮放。由于位圖記錄了每個像素的顏色信息,可以說像素點的數量決定了圖像的大小。如果要減少位圖的顯示,就必須丟失一些像素信息,容易導致失真。然而如果丟失的像素得到合理的控制,失真可以最小化。另外,顯示屏屏幕左上角的坐標為(0,0),屏幕右下角的坐標為(65535,65535)。采用差分比較法進行比較,首先將實際屏幕大小除以客戶窗口的大小,然后乘以當前鼠標坐標,得到鼠標在被控制計算機上的相應坐標。被控端的更新流程如圖5所示。

圖5 被控制端屏幕更新流程
如果終端控件直接控制終端,則以不同值的形式將與鼠標指針相關聯的不同事件傳遞給控制點,然后將相應的鼠標發送到控制端。此事件鏈接到可控端的坐標,通過鼠標事件函數執行。控制端用于主入口該圖顯示了一個窗口,其中信息(key information)等根據主網格端將代碼的值傳遞給控制端,然后使用keybd函數。如果客戶端使用遠程屏幕圖像,系統將通過取消標記捕獲當前圖像。然后將鼠標的位置坐標和按鍵經過網絡發送給服務器,服務器會模擬鼠標操作。
客戶端不僅可以直接對被控制端的屏幕進行操作,還可以對服務器用戶硬盤數據文件進行查看,下載或者刪除用戶的所有文件。服務器端收到來自客戶端的操作指令后,對文件進行相應的處理,然后返回發送給客戶端。
在基于Qt的遠程桌面集體監控系統設計過程中,遠程監控系統使用C/S結構,由服務器與客戶端構成。服務器安裝在被監控機器上,通過數據采集模塊獲取被監控機器上屏幕的點陣數據,進行傳輸。基于Qt的遠程桌面集體監控系統在功能內容上實現了對所需監控計算機的監控,可以幫助企業進行職工管理,同時可以幫助教師進行學生學習情況的監督。