2009-07-01 57 views
3

對於我們的安全的終端服務器的項目,我們有必要保持RDP會話開放,就是爲了防止超時和鎖定該會話的遠程計算機。一點背景:保持活動代碼失敗,新的RDP客戶端

我們必須配置爲多個虛擬服務器穿針引線劑,與啓動RDP會話到虛擬服務器,並有啓動應用程序客戶端件。該應用程序從數據庫讀取連接數據,包括連接到最終目標計算機的用戶名和密碼。

對於遠程桌面會話中,我們使用(使用AxImp)從mstscax.dll的提取的ActiveX控件。由於用戶無法訪問遠程機器的密碼,因此我們絕對必須避免會話超時。

在過去的幾個月中,我們一直在使用下面的代碼,通過一個Timer對象觸發,做到這一點。這很好,直到我不得不將RDP客戶端升級到版本6才能訪問Server 2008盒子(我們使用的是版本4或5,不確定是哪一個)。從那以後,SendKeys的調用有時會拋出一個HRESULT E_FAIL錯誤 - 通常會導致嚴重問題。

有沒有人有什麼可能會導致這種想法?更好的是,有沒有人有更好的方法來實現這一點,可以與新的RDP客戶端一起工作?

謝謝, 戴夫

 _mstscKeyControl = (IMsRdpClientNonScriptable)_mstsc.GetOcx(); 

    private void KeepAlive() 
    { 
     try 
     { 
      if (null != _mstsc && 0 != _mstsc.Connected) 
      { 
       bool[] bKeyUp = new bool[ 20 ]; 
       int[] KeyData = new int[ 20 ];   // value matches lParam parameter of WM_DOWN message 

       /* 
       * Send CAPS LOCK on followed by OFF 
       * 
       * The SendKeys routine will not allow remote data in a single call to be mixed with 
       * local data so this shouldn't mess up anything. 
       */ 

       KeyData[ 0 ] = (int)MapVirtualKey(14, 0); // vk_capital = CAPS LOCK 
       bKeyUp[ 0 ] = false; 
       KeyData[ 1 ] = KeyData[ 0 ]; 
       bKeyUp[ 1 ] = true; 

       _mstscKeyControl.SendKeys(2, ref bKeyUp[ 0 ], ref KeyData[ 0 ]); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace); 
     } 
    } 
+0

只是想知道。爲什麼不使用某種代理服務器,而是直接連接到數據庫? – djangofan 2009-07-14 15:22:40

+2

我不確定你想說什麼。你會用代理服務器取代什麼?你想重新設計系統,還是解決超時問題? – DaveN59 2009-07-14 19:05:45

+0

作爲一項後續行動,我們在此期間所做的僅僅是忽略例外。這個缺點是會議有時會超時。好處是,我們的代表不必處理消息框。到目前爲止,由於超時的發生率相對較低,所以這比預期的要好。 我們仍然需要更好的解決方案,儘管... – DaveN59 2009-07-28 18:54:22

回答

1

代替的SendKeys的,有沒有辦法通過某種鼠標移動的呢?如果您只將鼠標移動幾個像素,我懷疑這樣做的侵襲性較小。我不確定RDP是否具有某種鼠標移動閾值 - 可能只有幾個像素不足以重置斷開/鎖定超時。

我們最終會具有同樣的問題(我們的終端服務器目前是2003年,但我們會升級到2008年的某個時候),所以我真的有興趣知道你的解決方案最終被。

1

我有同樣的需要保持RDP 6從客戶端活着。來到這裏通過谷歌,嘗試sendkey和mousemove,沒有工作。轉出WM_ACTIVATE做伎倆。

這裏是我的基本AutoHotkey腳本段:

SetTimer, RemoteMachine_Tick, 60000 

RemoteMachine_Tick:

IfWinNotActive, remote01 - Remote Desktop 
    SendMessage, 0x006, 1, 0, , remote01 - Remote Desktop; 
    WM_ACTIVATE(0x006) WA_ACTIVE(1) 
return