使用新的RDP客户端保持活动代码失败

时间:2009-07-01 16:03:29

标签: c# .net-3.5 activex terminal-services keep-alive

对于我们的安全终端服务器项目,我们需要保持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 );
        }
    }

3 个答案:

答案 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来配置终端服务并保持会话处于活动状态?