3

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

3 回答 3

1

除了 sendkeys,有没有办法通过某种 mousemove 来代替?如果您只将鼠标移动几个像素,我怀疑这将不那么具有侵入性。不过,我不确定 RDP 是否有某种鼠标移动阈值 - 也许几个像素不足以重置断开/锁定超时。

我们最终会遇到同样的问题(我们的终端服务器目前是 2003,但我们会在某个时候升级到 2008),所以我真的很想知道您的解决方案最终是什么。

于 2009-07-08T22:01:13.193 回答
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
于 2011-03-14T19:02:30.100 回答
0

您是否尝试过管理组策略来配置终端服务并保持会话处于活动状态?

于 2009-07-28T03:26:17.080 回答