IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

blocage service avec WTSEnumerateSessions


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 170
    Par défaut blocage service avec WTSEnumerateSessions
    Bonjour

    j'ai développé un service Windows qui contrôle et comptabilise les session ICA et RDP sur les serveurs Citrix
    de temps en temps le service ce fige sur la fonction WTSEnumerateSessions
    il n'y a pas de plantage mais le processus reste bloqué sur l'appel de cette fonction en général lorsque que le serveur testé est en cours de redémarrage
    d'où un blocage du service
    ma question est comment éviter ce blocage ?
    j'arrive à le détecter en vérifiant la date de modification du fichier de log
    Je pensai passer par un thread mais s'il est bloqué je devrais utiliser TerminateThread pour arrêter le thread mais il me semble que ce n'est pas propre car générateur de fuite mémoire
    Si l'un de vous a des pistes merci par avance
    Voici la partie de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    procedure tRDSession.tester ;
    var
      hserveur : handle;
      booOk : boolean;
      ppsession : PWTS_SESSION_INFO;
      nbSession : dword;
      indexSession : dword;
      Session : WTS_SESSION_INFO;
      strTemp : string;
    begin
      fnbICA := 0;
      fnbRDP := 0;
      fbooListenICA := false;
      fbooListenRDP := false;
      fbooServeurOK := false;
      if strServeur ='' then exit;
      hserveur := WTSOpenServerA(pchar(fstrServeur));
      if hserveur = 0 then exit;
      try
    // c'est ici que cela ce fige
      booOk := WTSEnumerateSessionsA(hserveur,0,1,ppsession,nbSession );
      if booOk and (nbsession > 0 )then
      begin
        fbooServeurOK := true;
        for indexSession := 0 to nbSession-1 do
        begin
          Session := PWTS_SESSION_INFO(integer(ppsession)+indexsession * sizeof(wts_session_info))^;
          strTemp := lowercase(session.pWinStationName);
          if pos('ica-tcp#',strtemp)<> 0 then inc(fnbICA ,1);
          if pos('rdp-tcp#',strtemp)<> 0 then inc(fnbRDP ,1);
          if strTemp = 'ica-tcp' then fbooListenICA := session.State = WTSListen;
          if strTemp = 'rdp-tcp' then fbooListenRDP := session.State = WTSListen;
        end;
        WTSFreeMemory (ppsession );
      end;
      except
        on e:exception do
          fblog.add('Erreur : '+e.Message );
      end;
      WTSCloseServer(hserveur);
    end;

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Il existe pour les utilisateurs du domaine WTSSetUserConfig et WTS_CONFIG_CLASS :
    WTSUserConfigTimeoutSettingsConnections,
    WTSUserConfigTimeoutSettingsDisconnections,
    WTSUserConfigTimeoutSettingsIdle,
    WTSUserConfigBrokenTimeoutSettings

    Mais il n'y a pas, semble-t-il, pour modifier ce genre d'option juste un hServer
    Alors c'est ce qu'il te faudrait, raccourcir le temps de blocage !

    Faudrait voir comment le TjwTerminalServer de la JWSCL (JEDI Windows Security Code Library) \ JWAPI (JEDI Windows API) se sont débrouiller à ce sujet

    Si l'on regarde la BDR, il a un tas de truc

    Code BDR : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
    "NotificationTimeOut"=dword:00000000
    "DelayConMgrTimeout"=dword:00000000
     
     
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\DefaultUserConfiguration]
    "fInheritMaxDisconnectionTime"=dword:00000000
    "fInheritMaxIdleTime"=dword:00000000
    "fInheritMaxSessionTime"=dword:00000000
    "fInheritReconnectSame"=dword:00000000
    "fInheritResetBroken"=dword:00000000


    Avec des WebService, long à s’exécuter j'avais joué avec InternetSetOption et INTERNET_OPTION_CONNECT_TIMEOUT car sous IE6, c'était 30minutes, sous IE7, 30 secondes et VA si on tentait de modifier, et sous IE8 30 secondes et modifiables

    Faudrait voir si des API similaire permettrait de jouer sur le TimeOut de réponse de WTSEnumerateSessions
    Moi, je voulais l'allonger, toi tu veux le réduire !

    Je note que WTSFreeMemory pourrait ne pas être appelé en cas d'exception !
    Tu as donc une belle fuite mémoire potentielle !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
      try
        booOk := WTSEnumerateSessionsA(hserveur,0,1,ppsession,nbSession );
        if booOk and (nbsession > 0 )then
        begin
          try 
           fbooServeurOK := true;
           for indexSession := 0 to nbSession-1 do
           begin
             Session := PWTS_SESSION_INFO(integer(ppsession)+indexsession * sizeof(wts_session_info))^;
              strTemp := lowercase(session.pWinStationName);
              if pos('ica-tcp#',strtemp)<> 0 then inc(fnbICA ,1);
              if pos('rdp-tcp#',strtemp)<> 0 then inc(fnbRDP ,1);
              if strTemp = 'ica-tcp' then fbooListenICA := session.State = WTSListen;
              if strTemp = 'rdp-tcp' then fbooListenRDP := session.State = WTSListen;
            end;
          finally
            WTSFreeMemory (ppsession );
          end;
        end;
      except
        on e:exception do
          fblog.add('Erreur : '+e.Message );
      end;
    Pour finir : Why calling WTSEnumerateSessions in NT service initialization routine is a bad idea
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    Il y a du catastrophisme dans ce titre, mais finalement, à la fin de l'article...
    As we can see here, there is a call to RpcOpenEnum(…) function. Well, as it smells RPC, most likely, it is not yet initialized at this point. In order to prove this idea, I setup dependency to service RpcSS, restart machine, and voila, everything works.
    ...la solution est simple, logique et fiable

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 170
    Par défaut
    Bonjour

    merci pour les réponses
    @ShaiLeTroll : bien noté pour la fuite potentiel de mémoire
    et je vais regarder si il ya possibilité de régler le timeout

    @Andnotor : Mon service tourne sur un serveur de contrôle et va donc checker d'autre serveurs, le blocage ce produit lorsque je check un serveur distant qui redémarre

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    J'avais compris

    Avant tes tests, ne pourrais-tu pas envoyer un message à l'aide de WTSSendMessage (WM_NULL) avec un timeout pour t'assurer que le service distant est prêt à recevoir une commande ?

Discussions similaires

  1. Déploiement de Web Service avec InstallShield
    Par _beber85 dans le forum Services Web
    Réponses: 7
    Dernier message: 12/07/2006, 13h28
  2. Service avec vb, facile même qqes petits problèmes
    Par stephpr44 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 24/11/2005, 21h11
  3. Réponses: 3
    Dernier message: 30/08/2005, 09h09
  4. comment on peut faire un service avec builder c++
    Par infoactif dans le forum C++Builder
    Réponses: 8
    Dernier message: 11/08/2005, 17h33
  5. Réponses: 3
    Dernier message: 21/09/2003, 15h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo