Blocage WTSEnumerateSessions

Signaler
Messages postés
251
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
11 novembre 2016
-
Bonjour

j'ai développé un service Windows qui contrôle et rentabilise 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é redémarre
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
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 là que çà 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;