對於我們的安全的終端服務器的項目,我們有必要保持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);
}
}
只是想知道。爲什麼不使用某種代理服務器,而是直接連接到數據庫? – djangofan 2009-07-14 15:22:40
我不確定你想說什麼。你會用代理服務器取代什麼?你想重新設計系統,還是解決超時問題? – DaveN59 2009-07-14 19:05:45
作爲一項後續行動,我們在此期間所做的僅僅是忽略例外。這個缺點是會議有時會超時。好處是,我們的代表不必處理消息框。到目前爲止,由於超時的發生率相對較低,所以這比預期的要好。 我們仍然需要更好的解決方案,儘管... – DaveN59 2009-07-28 18:54:22