在我寫這篇日誌時 Microsoft Windows 2008已經出爐了,其中為世人津津樂道的是Microsoft的 RemoteApp。於是我亦研究了一下…發現它也是利用 Remote Desktop Client 去連接遠端的 Windows 2008 Terminal Service,然後呼叫安裝於 Windows 2008 的應用程式,並收執行畫面傳回來。在整個測試過程中,不難發現以下幾點:
1. Remote Desktop Client 一定要版本 6.1 以上才可使用。在觀看其 ActiveX Control 可知一二。因為祇有6.1版本才有 AdvancedSettings7,而 RemoteProgram 等的 property 正正要在 AdvancedSettings7。
2. 在Microsoft的 Download Center中,Windows 2003的 Remote Desktop Client到目前為止,最高版本也祇是 6.0版本。
3. 遠端的操作系統一定要 Windows 2008,因為祇有 Windows 2008 的 Terminal Service 才支援。意思是你的遠端所有 Application Servers 一定要 Windows 2008。即 Windows XP 可以呼叫 Windows 2008 的 Application,但 Windows 2008 並不可以呼叫 Windows XP 的 Application。如果是這樣的話,那麼粗略地估計也衍生出另外一些問題:
3.1 Windows 2008 是否 100% 能兼容 Windows XP 的 Application?
3.2 Windows 2008 Standard Edition的License + Windows 2008 Terminal Service的 License所需之費用是否比 Windows XP 的 Remote Desktop License 便宜?
總括來說,我感覺是Windows 2008這個 RemoteApp有點不切實際。
OK…話說回來,雖說 Microsoft的諸多不是,但這次練成類似 RemoteApp這種效果,還是要用到 Remote Desktop Client的 ActiveX Control。在 Internet 上,我曾經試著找 seamless RDP、seamless application類的字眼,但此終找不到一個免費而完美的答案。不過也找到非常非常接近的連結:
http://www.cendio.com/seamlessrdp/ 就是 Cendio 的 SeamlessRDP。
http://www.codeproject.com/KB/IP/tswindowclipper.aspx 就是The Code Project的 Extending Microsoft’s Terminal Services Client To Provide Seamless Windows By Martin Wickett。
http://properjavardp.sourceforge.net/ 就是properJavaRDP 開放成源碼計畫。
而我的靈感也是從以上相關資訊產生的。然而以上三個 seamless 方法,也有著共通一個短點,就是不能同時於同一個遠端開啟多於一個 Application。最簡單,大家可參考Mr. Martin Wickett的方法,利用瀏覽器去呼叫 RDP Client的ActiveX Control來連接遠端的 Terminal Service並啟動某一特定應用程式(如:Internet Explorer)。試試能不能呼叫了這個 IE 後,再呼叫多一次?當然不可以,因為兩次呼叫都是同一個登入賬戶嘛祇有一個User Session…自然另外的一個就給踼走了。
然而我的RemoteApp版本 1.0所實現的方法是需要有相關編程經驗才能達成的,其原理如下:
RemoteApp-Server
在遠端機器中準備一支服務應用程式 (RemoteApp-Server),該程式有以下特點:
1. 當程式一啟動就會將 Program Manager、Taskbar 隱藏。
2. 當程式一隱藏了Program Manager、Taskbar後,將底圖移走,將整個桌面顏色設為 Lime青檸色又或者自行決定用那種顏色。該顏色是作為Chroma Key的用途。
3. 接受遠端RemoteApp-Launcher連接。
4. 執行遠端RemoteApp-Launcher傳來要執行應用程式的指令。
5. 當對應的應用程式關閉時,要立即通知遠端RemoteApp-Launcher。
6. 當接到遠端RemoteApp-Launcher關閉指令,要立即關閉其對應的應用程式。
RemoteApp-Desktop
在使用者桌面上準備一支應用程式(RemoteApp-Desktop) ,該程式有以下特點:
1. 此程式沒有 Windows的Frame。
2. 內裡有著一個跟使用者桌面一樣大的 Remote Desktop Connection的ActiveX Control,使之重疊。
3. 當程式一開放,便根據預設值連接到遠端機器。
4. 該程式是 Always On Top模式。
5. 將RemoteApp-Desktop的主 Form的透明顏色設定成 RemoteApp-Server的Chroma Key 顏色,並設為定是使用透明模式。
RemoteApp-Launcher
在使用者桌面上準備另一支應用程式(RemoteApp-Launcher) ,該程式有以下特點:
1. 連接遠端的 RemoteApp-Server程式。
2. 傳送執行應用程式的指令到遠端的 RemoteApp-Server。
3. 當收到RemoteApp-Server發出的對應的應用程式關閉時,要立即關閉。
4. 當收到此應用程式關閉時,要立即通知遠端的 RemoteApp-Server。
實現了以幾個程式後,該軟體關係架構會變成這樣:
使用者從工作站登入的流程便會變成:
1. Thin Client 利用 RDP 連接 Windows Server 的 Terminal Service。
2. 成功登入後,會產生一個 User Session。
3. 在這個 User Session建立後,該登入賬戶便會自動開啟 RemoteApp-Desktop。
4. RemoteApp-Desktop根據預設的資訊,自動以 RDP連接到遠端的VM。但由於RemoteApp-Desktop設了透明,所以看不見的。
5. 遠端的VM被登入後,便自動開啟 RemoteApp-Server。
6. RemoteApp-Server開啟後,會等待 RemoteApp-Launcher連接。
使用者從工作站開啟 Application 1的流程便會變成:
1. 使用者在其 User Session中,開啟Application 1的RemoteApp-Launcher。
2. RemoteApp-Launcher連接到 RemoteApp-Server建立連接 Session,並要求RemoteApp-Server開啟 Application 1。
3. RemoteApp-Server 收到指令後,執行 Application 1。由於Application 1並不是透明,所以從使用者的角度祇看到 Application 1 所顯示的畫面區域。從而達成 Seamless Application效果。
如果大家真的可以實作出來,應該感覺到不錯吧…真的很像 XenApp。這個Work Around的方法我也很滿意,一來不用重新編寫 Terminal Service、Protocol和RDP Client(即使要我寫我可能也不出來,這些東西不是一兩個人可以寫出來的,何妨我孤身一人!?)。二來這個方法也十分簡單,不用百行程式就可搞定的事。不過,這裡仍有一個很大的問題存在,這就是 Network Load…不信?看看你開啟 Application 1後,由 Windows Server的Terminal Service連接到 Thin Client之間的 Network Load…一塊 100Mbps連接的網絡,由原先的0.x%可即時高至18%…解決辦法,留待下一篇再說。
沒有留言:
張貼留言