3

セキュア ターミナル サーバー プロジェクトでは、RDP セッションを開いたままにしておく必要があります。つまり、リモート コンピューターがタイムアウトしてセッションがロックされるのを防ぐ必要があります。少し背景:

仮想サーバーへの RDP セッションを開始し、そこでアプリケーションを開始するクライアント部分を備えた、仲介エージェントとして構成された複数の仮想サーバーがあります。そのアプリケーションは、データベースから接続データを読み取ります。これには、最終的な宛先コンピューターに接続するためのユーザー名とパスワードが含まれます。

リモート デスクトップ セッションでは、MSTSCAX.DLL から (AxImp を使用して) 抽出された ActiveX コントロールを使用します。ユーザーはリモート マシンのパスワードにアクセスできないため、セッションがタイムアウトしないようにする必要があります。

過去数か月間、Timer オブジェクトによってトリガーされる次のコードを使用して、これを実現してきました。Server 2008ボックスにアクセスするためにRDPクライアントをバージョン6にアップグレードする必要があるまでは、うまくいきました(バージョン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

クライアント側から RDP 6 を有効にしておく必要があります。Google経由でここに来て、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 に答える
1

sendkeys の代わりに、ある種の mousemove を渡す方法はありますか? マウスを数ピクセル動かすだけなら、侵襲性が低くなると思います。ただし、RDP にある種のマウス移動のしきい値があるかどうかはわかりません。切断/ロックのタイムアウトをリセットするには、数ピクセルでは不十分かもしれません。

最終的にはこれと同じ問題が発生するので (ターミナル サーバーは現在 2003 ですが、いずれ 2008 にアップグレードする予定です)、解決策が最終的にどうなるか知りたいです。

于 2009-07-08T22:01:13.193 に答える
0

グループ ポリシーを管理して、ターミナル サービスを構成し、セッションをアクティブに維持しようとしましたか?

于 2009-07-28T03:26:17.080 に答える