2009-07-01 3 views
3

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); 
     } 
    } 
+0

me demandais. Pourquoi ne pas utiliser une sorte de serveur proxy pour que vous puissiez vous connecter directement à la base de données? – djangofan

+2

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

+0

À 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

Répondre

1

au lieu d'un sendkeys, est-il un moyen de passer une sorte de mousemove à la place? Je pense que cela serait moins invasif, si vous déplacez seulement la souris de quelques pixels. Je ne suis pas sûr si RDP a un certain seuil de mouvement de la souris, cependant - peut-être que quelques pixels ne suffisent pas pour réinitialiser le délai de déconnexion/verrouillage.

Nous finirons par avoir le même problème (notre serveur de terminal est actuellement 2003, mais nous allons passer à 2008 à un moment donné), donc je serais vraiment intéressé de savoir ce qui se termine votre solution par être.

0

Avez-vous essayé de gérer Group Policies pour configurer les services Terminal Server et maintenir la session active?

+0

Ce serait une bonne idée, si je pouvais convaincre les départements informatiques de tous nos clients plus de 1400 pour le faire.Puisque ce n'est pas vraiment réalisable (ou même souhaitable), j'ai toujours besoin d'une solution côté client. – DaveN59

+0

Les clients lancent donc des sessions RDP sur des serveurs virtuels et hébergent-ils les serveurs virtuels? J'avais l'impression que vous hébergiez les serveurs en cours de RDP. – MyItchyChin

+0

En fait, vous avez raison. Nous gérons le premier niveau de serveurs virtuels et nous empêchons les sessions d'expirer à l'aide des stratégies de groupe. La prochaine étape de la connexion est ce qui me préoccupe, quand nous RDP à partir de là vers les ordinateurs clients. – DaveN59

1

J'ai le même besoin de maintenir RDP 6 en vie du côté client. Entré ici via google, essayé sendkey et mousemove, n'a pas fonctionné. Turn out WM_ACTIVATE faire l'affaire.

Voici mon segment de base de script 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 
+0

Quelle langue est-ce? Que fait "SendMessage, 0x006, 1, 0,, ​​remote01 - Bureau à distance;" signifie, et "WM_ACTIVATE (0x006) WA_ACTIVE (1)"? –

+0

C'est un script AutoHotkey, WM_ACTIVATE est un message, WA_ACTIVE est un paramètre pour le message. Sous les couvertures, ce ne sont que des chiffres - WM_ACTIVATE a 6, WA_ACTIVE est 1. [msdn link] (http://msdn.microsoft.com/fr-fr/library/windows/desktop/ms646274 (v = vs.85) .aspx) –

Questions connexes