对于我们的安全终端服务器项目,我们需要保持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 );
}
}
答案 0 :(得分:1)
而不是sendkeys,有没有办法通过某种类型的鼠标移动?我怀疑如果你只移动几个像素,这将是更少侵入性。我不确定RDP是否有某种鼠标移动阈值 - 可能只有几个像素不足以重置断开/锁定超时。
我们最终会遇到同样的问题(我们的终端服务器目前是2003年,但我们会在某个时候升级到2008年),所以我真的很想知道你的解决方案最终会是什么。
答案 1 :(得分: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
答案 2 :(得分:0)
您是否尝试过管理Group Policies来配置终端服务并保持会话处于活动状态?