Pour notre projet Secure Terminal Server, nous avons besoin de garder la session RDP ouverte, c'est-à-dire d'empêcher l'ordinateur distant de temporiser et de verrouiller la session. Un petit arrière-plan:Le code de maintien en vie échoue avec le nouveau client RDP
Nous avons plusieurs serveurs virtuels configurés en tant qu'agents intermédiaires, avec un composant client qui lance une session RDP sur les serveurs virtuels et y démarre une application. Cette application lit les données de connexion d'une base de données, y compris le nom d'utilisateur et le mot de passe pour se connecter à l'ordinateur de destination finale.
Pour les sessions de bureau à distance, nous utilisons le contrôle ActiveX extrait de MSTSCAX.DLL (en utilisant AxImp). Parce que l'utilisateur n'a pas accès au mot de passe pour l'ordinateur distant, nous devons absolument empêcher la session de se terminer.
Au cours des derniers mois, nous avons utilisé le code suivant, déclenché par un objet Timer, pour ce faire. Cela a fonctionné très bien, jusqu'à ce que je devais mettre à jour le client RDP à la version 6 afin d'accéder aux boîtes de serveur 2008 (nous utilisions la version 4 ou 5, ne sachant pas lequel). Depuis lors, l'appel à SendKeys provoque parfois une erreur HRESULT E_FAIL - assez souvent pour causer des problèmes majeurs.
Quelqu'un a-t-il une idée de ce qui pourrait être à l'origine de cette situation? Mieux encore, est-ce que quelqu'un a une meilleure façon d'accomplir cela qui peut fonctionner avec le nouveau client RDP?
Merci, Dave
_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);
}
}
me demandais. Pourquoi ne pas utiliser une sorte de serveur proxy pour que vous puissiez vous connecter directement à la base de données? – djangofan
Je ne suis pas sûr de ce que vous essayez de dire. Que remplaceriez-vous avec le serveur proxy? Essayez-vous de repenser le système ou de résoudre le problème de timeout? – DaveN59
À titre de suivi, ce que nous faisons dans l'intervalle consiste simplement à ignorer l'exception. L'inconvénient de ceci est que la session va parfois expirer. L'avantage est, nos représentants n'ont pas à faire face à la boîte de message. Jusqu'à présent, cela fonctionne mieux que prévu, car l'incidence des délais d'attente est relativement faible. Nous avons toujours besoin d'une meilleure solution, cependant ... – DaveN59