セキュア ターミナル サーバー プロジェクトでは、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 );
}
}