对于我们的安全终端服务器项目,我们需要保持 RDP 会话打开,即防止远程计算机超时并锁定会话。一点背景:
我们有几个配置为中间代理的虚拟服务器,其中一个客户端向虚拟服务器启动 RDP 会话,并在那里启动应用程序。该应用程序从数据库中读取连接数据,包括用于连接到最终目标计算机的用户名和密码。
对于远程桌面会话,我们使用从 MSTSCAX.DLL 中提取的 ActiveX 控件(使用 AxImp)。因为用户无权访问远程机器的密码,所以我们绝对必须防止会话超时。
在过去的几个月里,我们一直在使用由 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 );
}
}