[WD9] [TSE] Liste des applications en cours d'exécution

Le
Emmanuel Haefele
Bonjour,

Je cherche désespérement à récuperer depuis une session TSE la liste des
applications (plus précisément de mon application) en cours d'exécution
sur le serveur. Pour cela j'ai testé l'ensemble des fonctions WinDev
(notamment ExeListeProcessus()) ou quelques bouts de code utilisant les
API mais aucun ne répond à mon besoin puisque tous me listent les
processus de la session.

Donc ma question est assez simple, est-ce possible et si oui par quel
biais ?

Par avance merci


Amicalement,

Emmanuel Haefelé.
Vos réponses
Trier par : date / pertinence
Gilles TOURREAU
Le #14362021
Emmanuel Haefele avait prétendu :
Bonjour,

Je cherche désespérement à récuperer depuis une session TSE la liste des
applications (plus précisément de mon application) en cours d'exécution
sur le serveur. Pour cela j'ai testé l'ensemble des fonctions WinDev
(notamment ExeListeProcessus()) ou quelques bouts de code utilisant les
API mais aucun ne répond à mon besoin puisque tous me listent les
processus de la session.

Donc ma question est assez simple, est-ce possible et si oui par quel
biais ?

Par avance merci


Amicalement,

Emmanuel Haefelé.



Bibliothèque : "Wtsapi32"

Le principle :
Il faut se connecter avec WTSOpenServer() afin de récuperer un handle
qui correspond au serveur...

Et ensuite tu appelles : WTSEnumerateProcesses() qui énumère tes
processus.

Si tu as des problèmes pour utiliser ces fonctions n'hésites pas à le
signaler...

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Emmanuel Haefele
Le #14361941
"Gilles TOURREAU"
Bonjour Gilles,

Bibliothèque : "Wtsapi32"



Je ne suis plus à mon bureau mais il me semble avoir travaillé sur cette
API.

Le principle :
Il faut se connecter avec WTSOpenServer() afin de récuperer un handle
qui correspond au serveur...



Ca ça ne me dit rien

Et ensuite tu appelles : WTSEnumerateProcesses() qui énumère tes
processus.



Ok

Si tu as des problèmes pour utiliser ces fonctions n'hésites pas à le
signaler...



Je vais regarder tout ça demain. Je ne suis pas très féru des API Windows
donc il est fort probale que je revienne vers toi si ça coince :-(

En tout les cas merci !


Amicalement,

Emmanuel Haefelé.
Emmanuel Haefele
Le #14361761
"Gilles TOURREAU"
Bonjour Gilles,

Si tu as des problèmes pour utiliser ces fonctions n'hésites pas à le
signaler...



Je te remercie car grace à tes suggestions j'ai bien avancé !

En fait j'ai retrouvé sur le net une procédure qui permet de récupérer la
liste des sessions ouvertes sur un terminal serveur à l'aide de la
fonction WTSOpenServer(). Je l'ai donc ensuite adapté pour lister les
process et j'ai obtenu quelques résultats puisqu'elle me liste bien des
process appartenant à différentes sessions. Le seul problème que je
rencontre c'est qu'il ne me liste pas la totalité des process mais
seulement certain, il en oublie et je ne sais pas bien pourquoi ?

Si tu as une idée de l'origine du problème ? Je me permet donc de mettre
ici mon code ainsi que celui qui liste les sessions et qui fonctionne, si
ça en intéresse certain.

Au passage ;-)
Si tu as une idée pour récupérer le nom du programme associé au process,
voire la cerise sur le gâteau avec le nom de la machine, je suis aussi
preneur. Merci !

-=-=-=-=-=-
Liste des process
-=-=-=-=-=-

sMaZoneMem est une chaîne = "PROCESS_TSE"
sLigneMem est une chaîne = ""

WTS_PROCESS_INFO est une structure
SessionID est un entier
ProcessID est un entier
pProcessName est un entier
pUserSid est un entier
FIN

liDLLHandle, hServer are int
pCount , p, p1, pBytes, retval, i are int
dynarrProcessInfo is array dynamic of 1 WTS_PROCESS_INFO
ServerName is ASCIIZ string on 257

MemCrée ( sMaZoneMem )

liDLLHandle = LoadDLL("WTSAPI32")
IF liDLLHandle > 0 THEN

ServerName = "\" + NetNomMachine()

hServer=API("WTSAPI32","WTSOpenServerA",&ServerName)
Multitask(10)
IF hServer>0 THEN
retval=API("WTSAPI32","WTSEnumerateProcessesA",hServer,0,1,&p,&pCount)
IF NOT retval ALORS RETURN
IF pCount>0 THEN

//redim array of WTS_PROCESS_INFO structures
Dimension(dynarrProcessInfo,pCount)

//16 = size of 1 WTS_PROCESS_INFO structure
Transfer(&dynarrProcessInfo,p,16*pCount)
END

FOR i = 1 TO pCount

MemAjoute ( sMaZoneMem, dynarrProcessInfo[i]:SessionID,...
dynarrProcessInfo[i]:SessionID ...
+ TAB + dynarrProcessInfo[i]:ProcessID ...
+ TAB + dynarrProcessInfo[i]:pProcessName ...
+ TAB + dynarrProcessInfo[i]:pUserSid )

END

API("WTSAPI32","WTSFreeMemory",p)

END

API("WTSAPI32","WTSCloseServer",hServer)
END

FreeDLL(liDLLHandle)

sLigneMem = MemPremier ( sMaZoneMem )
TANTQUE PAS MemEnDehors ( sMaZoneMem )
Trace ( sLigneMem )
sLigneMem = MemSuivant ( sMaZoneMem )
FIN

MemSupprimeTout ( sMaZoneMem )


-=-=-=-=-=-
Liste des sessions
-=-=-=-=-=-

sMaZoneMem est une chaîne = "SESSION_TSE"
sLigneMem est une chaîne = ""

WTS_SESSION_INFO is structure
SessionId is int
pWinStationName is int
state is int
END

arrSessionStates is array fixed of 10 string
arrSessionStates[1]="Active"
arrSessionStates[2]="Connected"
arrSessionStates[3]="Query"
arrSessionStates[4]="Shadow"
arrSessionStates[5]="Disconnected"
arrSessionStates[6]="Idle"
arrSessionStates[7]="Listen"
arrSessionStates[8]="Reset"
arrSessionStates[9]="Down"
arrSessionStates[10]="Initialize"

liDLLHandle, hServer are int
pCount , p, p1, pBytes, retval, i, j are int
fsWinStationName is ASCIIZ string on 128
fsUserName is ASCIIZ string on 260
dynarrSessionInfo is array dynamic of 1 WTS_SESSION_INFO
ServerName is ASCIIZ string on 257

MemCrée ( sMaZoneMem )

liDLLHandle = LoadDLL("WTSAPI32")
IF liDLLHandle > 0 THEN
ServerName = "\" + NetNomMachine()
hServer=API("WTSAPI32","WTSOpenServerA",&ServerName)
Multitask(10)
IF hServer>0 THEN

retval=API("WTSAPI32","WTSEnumerateSessionsA", ...
hServer,0,1,&p,&pCount)

IF NOT retval RETURN

IF pCount>0 THEN

//redim array of WTS_SESSION_INFO structures
Dimension(dynarrSessionInfo,pCount)

//12 = size of 1 WTS_SESSION_INFO structure
Transfer(&dynarrSessionInfo,p,12*pCount)

END

API("WTSAPI32","WTSFreeMemory",p)

FOR i = 1 TO pCount
retval=API("WTSAPI32","WTSQuerySessionInformationA", ...
hServer,dynarrSessionInfo[i]:SessionID,6,&p1,&pBytes)

//6= WTSWinStationName
fsWinStationName=""

IF retval THEN
IF pBytes>0 THEN
Transfer(&fsWinStationName,p1,pBytes)
END

API("WTSAPI32","WTSFreeMemory",p1)
p1=0

END

MemAjoute ( sMaZoneMem, dynarrSessionInfo[i]:SessionID, ...
dynarrSessionInfo[i]:SessionID ...
+ TAB + fsWinStationName ...
+ TAB + arrSessionStates[dynarrSessionInfo[i]:State + 1] )

END
END

API("WTSAPI32","WTSCloseServer",hServer)

END

FreeDLL(liDLLHandle)

sLigneMem = MemPremier ( sMaZoneMem )

TANTQUE PAS MemEnDehors ( sMaZoneMem )

Trace ( sLigneMem )

sLigneMem = MemSuivant ( sMaZoneMem )

FIN

MemSupprimeTout ( sMaZoneMem )
Gilles TOURREAU
Le #14361731
Emmanuel Haefele a exposé le 01/09/2006 :
"Gilles TOURREAU"
Bonjour Gilles,

Si tu as des problèmes pour utiliser ces fonctions n'hésites pas à le
signaler...



Je te remercie car grace à tes suggestions j'ai bien avancé !

En fait j'ai retrouvé sur le net une procédure qui permet de récupérer la
liste des sessions ouvertes sur un terminal serveur à l'aide de la
fonction WTSOpenServer(). Je l'ai donc ensuite adapté pour lister les
process et j'ai obtenu quelques résultats puisqu'elle me liste bien des
process appartenant à différentes sessions. Le seul problème que je
rencontre c'est qu'il ne me liste pas la totalité des process mais
seulement certain, il en oublie et je ne sais pas bien pourquoi ?

Si tu as une idée de l'origine du problème ? Je me permet donc de mettre
ici mon code ainsi que celui qui liste les sessions et qui fonctionne, si
ça en intéresse certain.

Au passage ;-)
Si tu as une idée pour récupérer le nom du programme associé au process,
voire la cerise sur le gâteau avec le nom de la machine, je suis aussi
preneur. Merci !

-=-=-=-=-=-
Liste des process
-=-=-=-=-=-

sMaZoneMem est une chaîne = "PROCESS_TSE"
sLigneMem est une chaîne = ""

WTS_PROCESS_INFO est une structure
SessionID est un entier
ProcessID est un entier
pProcessName est un entier
pUserSid est un entier
FIN

liDLLHandle, hServer are int
pCount , p, p1, pBytes, retval, i are int
dynarrProcessInfo is array dynamic of 1 WTS_PROCESS_INFO
ServerName is ASCIIZ string on 257

MemCrée ( sMaZoneMem )

liDLLHandle = LoadDLL("WTSAPI32")
IF liDLLHandle > 0 THEN

ServerName = "\" + NetNomMachine()

hServer=API("WTSAPI32","WTSOpenServerA",&ServerName)
Multitask(10)
IF hServer>0 THEN
retval=API("WTSAPI32","WTSEnumerateProcessesA",hServer,0,1,&p,&pCount)
IF NOT retval ALORS RETURN
IF pCount>0 THEN

//redim array of WTS_PROCESS_INFO structures
Dimension(dynarrProcessInfo,pCount)

//16 = size of 1 WTS_PROCESS_INFO structure
Transfer(&dynarrProcessInfo,p,16*pCount)
END

FOR i = 1 TO pCount

MemAjoute ( sMaZoneMem, dynarrProcessInfo[i]:SessionID,...
dynarrProcessInfo[i]:SessionID ...
+ TAB + dynarrProcessInfo[i]:ProcessID ...
+ TAB + dynarrProcessInfo[i]:pProcessName ...
+ TAB + dynarrProcessInfo[i]:pUserSid )

END

API("WTSAPI32","WTSFreeMemory",p)

END

API("WTSAPI32","WTSCloseServer",hServer)
END

FreeDLL(liDLLHandle)

sLigneMem = MemPremier ( sMaZoneMem )
TANTQUE PAS MemEnDehors ( sMaZoneMem )
Trace ( sLigneMem )
sLigneMem = MemSuivant ( sMaZoneMem )
FIN

MemSupprimeTout ( sMaZoneMem )


-=-=-=-=-=-
Liste des sessions
-=-=-=-=-=-

sMaZoneMem est une chaîne = "SESSION_TSE"
sLigneMem est une chaîne = ""

WTS_SESSION_INFO is structure
SessionId is int
pWinStationName is int
state is int
END

arrSessionStates is array fixed of 10 string
arrSessionStates[1]="Active"
arrSessionStates[2]="Connected"
arrSessionStates[3]="Query"
arrSessionStates[4]="Shadow"
arrSessionStates[5]="Disconnected"
arrSessionStates[6]="Idle"
arrSessionStates[7]="Listen"
arrSessionStates[8]="Reset"
arrSessionStates[9]="Down"
arrSessionStates[10]="Initialize"

liDLLHandle, hServer are int
pCount , p, p1, pBytes, retval, i, j are int
fsWinStationName is ASCIIZ string on 128
fsUserName is ASCIIZ string on 260
dynarrSessionInfo is array dynamic of 1 WTS_SESSION_INFO
ServerName is ASCIIZ string on 257

MemCrée ( sMaZoneMem )

liDLLHandle = LoadDLL("WTSAPI32")
IF liDLLHandle > 0 THEN
ServerName = "\" + NetNomMachine()
hServer=API("WTSAPI32","WTSOpenServerA",&ServerName)
Multitask(10)
IF hServer>0 THEN

retval=API("WTSAPI32","WTSEnumerateSessionsA", ...
hServer,0,1,&p,&pCount)

IF NOT retval RETURN

IF pCount>0 THEN

//redim array of WTS_SESSION_INFO structures
Dimension(dynarrSessionInfo,pCount)

//12 = size of 1 WTS_SESSION_INFO structure
Transfer(&dynarrSessionInfo,p,12*pCount)

END

API("WTSAPI32","WTSFreeMemory",p)

FOR i = 1 TO pCount
retval=API("WTSAPI32","WTSQuerySessionInformationA", ...
hServer,dynarrSessionInfo[i]:SessionID,6,&p1,&pBytes)

//6= WTSWinStationName
fsWinStationName=""

IF retval THEN
IF pBytes>0 THEN
Transfer(&fsWinStationName,p1,pBytes)
END

API("WTSAPI32","WTSFreeMemory",p1)
p1=0

END

MemAjoute ( sMaZoneMem, dynarrSessionInfo[i]:SessionID, ...
dynarrSessionInfo[i]:SessionID ...
+ TAB + fsWinStationName ...
+ TAB + arrSessionStates[dynarrSessionInfo[i]:State + 1] )

END
END

API("WTSAPI32","WTSCloseServer",hServer)

END

FreeDLL(liDLLHandle)

sLigneMem = MemPremier ( sMaZoneMem )

TANTQUE PAS MemEnDehors ( sMaZoneMem )

Trace ( sLigneMem )

sLigneMem = MemSuivant ( sMaZoneMem )

FIN

MemSupprimeTout ( sMaZoneMem )



Quand tu dis qu'il ne liste pas tous les process, c'est à dire que :

pCount ne contient pas le nombre de processus qu'il y a sur le server ?
As-tu essayé avec les droits administrateurs ?

Le nom du process se trouve dans la variable pProcessName que tu
récupères dans la structure WTS_PROCESS_INFO.

Parcontre je ne comprends pas ce que tu dis par le nom de la machine...
Normalement c'est le nom du serveur que t'utilises pour faire ton
WTS_OpenServer() ?

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Emmanuel Haefele
Le #14361671
"Gilles TOURREAU"
pCount ne contient pas le nombre de processus qu'il y a sur le server ?



C'est bien ça effectivement.

As-tu essayé avec les droits administrateurs ?



Je n'en suis pas certain mais il me semble que mon user les avait. Ceci
dit je vais encore vérifier ça lundi, voire même exécuter la procédure
directement sur le serveur en administrateur et non pas dans une session.

Le nom du process se trouve dans la variable pProcessName que tu
récupères dans la structure WTS_PROCESS_INFO.



Effectivement c'est bien ça mais la valeur de cette variable pProcessName
est numérique. Je suppose qu'il faut utiliser la fonction transfert, je la
connais très peu. Est-ce qu'un truc du genre devrait fonctionner :

Transfer(&sNomProcess, dynarrProcessInfo[i]:pProcessName, 4 )

Je ne suis pas certain du tout de ce code et encore moins de la valeur 4
en troisième position. J'ai vu un code vb qui récurépait ça caractère par
caractère, faut-il faire la même chose en windev, je ne sais pas :-(

Parcontre je ne comprends pas ce que tu dis par le nom de la machine...
Normalement c'est le nom du serveur que t'utilises pour faire ton
WTS_OpenServer() ?



Je me suis sans doute mal exprimé. Je parlais du nom du pc (ou de la
session) qui exécute le process. Son IP ferait également l'affaire.


Amicalement,

Emmanuel Haefelé.
Gilles TOURREAU
Le #14361661
Emmanuel Haefele a pensé très fort :
"Gilles TOURREAU"
pCount ne contient pas le nombre de processus qu'il y a sur le server ?



C'est bien ça effectivement.

As-tu essayé avec les droits administrateurs ?



Je n'en suis pas certain mais il me semble que mon user les avait. Ceci
dit je vais encore vérifier ça lundi, voire même exécuter la procédure
directement sur le serveur en administrateur et non pas dans une session.

Le nom du process se trouve dans la variable pProcessName que tu
récupères dans la structure WTS_PROCESS_INFO.



Effectivement c'est bien ça mais la valeur de cette variable pProcessName est
numérique. Je suppose qu'il faut utiliser la fonction transfert, je la
connais très peu. Est-ce qu'un truc du genre devrait fonctionner :

Transfer(&sNomProcess, dynarrProcessInfo[i]:pProcessName, 4 )



En effet pProcessName est un pointeur, il faut donc récuperer la chaine
en fesant çà octet par octet jusqu'à ce que tu trouve le caractères
NULL (Code ASCII 0) qui indique la fin de la chaine...

Quelque chose comme ca

pos est un entier
c est un caractère
ch est une chaine

pos = 0
Transfert(&c, dynarrProcessInfo[i]:pProcessName, 1)
TANTQUE Asc(c) <> 0
ch += c
pos++
Transfert(&c, dynarrProcessInfo[i]:pProcessName + pos, 1)
FIN


Je ne suis pas certain du tout de ce code et encore moins de la valeur 4
en troisième position. J'ai vu un code vb qui récurépait ça caractère par
caractère, faut-il faire la même chose en windev, je ne sais pas :-(

Parcontre je ne comprends pas ce que tu dis par le nom de la machine...
Normalement c'est le nom du serveur que t'utilises pour faire ton
WTS_OpenServer() ?



Je me suis sans doute mal exprimé. Je parlais du nom du pc (ou de la
session) qui exécute le process. Son IP ferait également l'affaire.




La fonction WTSQuerySessionInformation() devrait faire l'affaire avec
comme paramètre pour WTSInfoClass :
- WTSClientAddress pour l'IP
- WTSClientName pour l'IP

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Emmanuel Haefele
Le #14361351
"Gilles TOURREAU"
Bonjour Gilles,

Quand tu dis qu'il ne liste pas tous les process, c'est à dire que :

pCount ne contient pas le nombre de processus qu'il y a sur le server ?
As-tu essayé avec les droits administrateurs ?



J'ai essayé avec les droits administrateurs et effectivement ça venait de
là, il faut avoir certaines permissions pour obtenir les informations que
je recherche. Il en est (à priori) de même pour la fonction
WTSQuerySessionInformation().

Donc que j'énumère les process ou les sessions, je n'arriverais
malheureusement pas à obtenir les informations que je recherche car mes
utilisateurs en général n'ont pas les droits requis.

Ceci dit je te remercie pour ton aide, c'était très intéressant.


Amicalement,

Emmanuel Haefelé.
Publicité
Poster une réponse
Anonyme