OVH Cloud OVH Cloud

Comment connaitre A DISTANCE le(s) utilisateur(s) ayant ouvert une session sur une machine?

8 réponses
Avatar
Jean-Claude BELLAMY
Hello World !

Je transpire depuis plus d'une semaine sur ce problème, apparemment simple à
résoudre :

J'ai besoin de connaitre - à distance - sur une machine donnée de mon LAN
(sous NT4, W2K, XP, W2K3) :
- s'il y a une session ouverte
- si oui, qui a ouvert cette session
(éventuellement, dans le cas de XP ou TSE
il peut y en avoir plusieurs)

Mon appli est en Delphi, mais le langage n'a pas d'importance ..

J'ai commencé par essayer plusieurs méthodes :

1) Utilisation de l'API NetAPI32, avec la fonction
"NetWkstaUserEnum"
Elle énumère bien les sessions, mais même après que
toute session soit fermée, la session précédente apparait
encore ! (comme s'il y avait un "cache")
Donc inutilisable !

2) Utilisation de l'API NetAPI32, avec la fonction
"NetSessionEnum"
Elle énumère les connexions venant de l'extérieur.
Donc aucun intérêt ici.

3) J'ai regardé du côté de "LsaEnumerateLogonSessions",
mais çà ne concerne que la machine LOCALE.
Or j'ai besoin de le faire également à distance.

4) J'ai fini par me tourner vers WMI, et plus précisément
la classe Win32_Process.
(j'ai fait appel à un ensemble assez génial WMI pour Delphi :
http://www.online-admin.com/wmiset.html )
- J'énumère les processus de la machine (distante ou locale)
- je teste si c'est "Explorer.exe",
- et si oui je récupère le compte qui l'a lancé
par la méthode GetOwner(user,domain)
S'il n'y a aucun processus explorer, c'est qu'aucune session
n'a été ouverte
S'il y a en a plusieurs, (avec des noms de comptes différents)
c'est qu'on est en multi-session (TSE/XP bascuement de compte...)

Donc cette dernière méthode répond bien à ce que je cherche, mais je la
trouve un peu lourdingue !!!

De plus, elle suppose implicitement que c'est "explorer.exe" le shell.
Or ce n'est pas forcément çà, même si c'est la situation dans 99.999% des
cas.
Certes, je peux tester la clef HKLM\SOFTWARE\Microsoft\Windows
NT\CurrentVersion\Winlogon\Shell , en ayant démarré au préalable à distance
le service RemoteRegistry s'il est arrêté (sous W2K et au-delà).
Là, çà devient usine à gaz !



Donc j'aimerais bien faire cela directement, sans passer par WMI, avec les
fonctions d'une API Windows donnée.
J'ai fouillé tout le MSDN (fonctions LSA, authentication, ...,), sans
résultat positif.
J'ai exploré tous les forums, sites, ..., (Google a chauffé un max!) en vain
.
Çà serait quand même incroyable que je sois le premier à tenter de résoudre
ce pb !


Je suis donc à la recherche de toute suggestion.
Merci d'avance ...

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
Jean-Claude.Bellamy@wanadoo.fr * JC.Bellamy@free.fr

8 réponses

Avatar
Patrick D.
On Thu, 30 Dec 2004 20:48:03 +0100, Jean-Claude BELLAMY
wrote:


surtout qu'un logiciel comme Hyena le fait sans problèmes

allez, un petit coup de ProcessXp pour voir les api appellées dans ce cas
....


--
* enlevez '.don't.spam' et '.invalid' de mon adresse eMail si vous voulez
m'écrire *
* Donne un poisson à un homme, il aura à manger pour un jour
* Apprends-lui à pêcher, il aura à manger pour tous les jours de sa vie *
Avatar
Vincent Burel
"Jean-Claude BELLAMY" wrote in message
news:41d45bf9$0$2758$
Hello World !

Je transpire depuis plus d'une semaine sur ce problème, apparemment simple


à
résoudre :

J'ai besoin de connaitre - à distance - sur une machine donnée de mon LAN
(sous NT4, W2K, XP, W2K3) :



Vous n'avez pas essayé les fonctions WNetxxx comme WNetOpenEnum par
exemple... Moi j'utilise ca pour scanner les computer du réseau, mais pour
récupérer les user connectés il me semble qu'il y a aussie des fonctions qui
vont bien... De plus compatible W95 / NT3.1 ... faut voir...

VB
Avatar
Jean-Claude BELLAMY
(J'ai groupé ici mes réponses aux réponses de Vincent Burel et Patrick
Dubois)
--------------------------------------------------------
Dans le message news:41d46de2$0$2744$ ,
Vincent Burel s'est ainsi exprimé:

"Jean-Claude BELLAMY" wrote in
message news:41d45bf9$0$2758$
Hello World !

Je transpire depuis plus d'une semaine sur ce problème, apparemment
simple à résoudre :

J'ai besoin de connaitre - à distance - sur une machine donnée de
mon LAN (sous NT4, W2K, XP, W2K3) :



Vous n'avez pas essayé les fonctions WNetxxx comme WNetOpenEnum par
exemple... Moi j'utilise ca pour scanner les computer du réseau, mais
pour récupérer les user connectés il me semble qu'il y a aussie des
fonctions qui vont bien... De plus compatible W95 / NT3.1 ... faut
voir...



Merci de me répondre, mais cela ne répond pas à mon pb.
Les fonctions WNetxxxx concernent les resources réseau, et non pas les
sessions localement ouvertes!

P.ex. la fonction WNetGetUser va retourner un nom d'utilisateur, mais ce
sera celui qui a effectué un "net use ..." quelque part, or çà, je m'en
fiche!
(tout comme ce que me sort "NetEnumsession" de la NetAPI32)

Ce que je veux, c'est savoir si sur la machine distante "X" quelqu'un a
ouvert une session localement (CTRL-ALT-DEL, processus Winlogon->Gina, LSA,
tout çà ..) et si oui, quel est ce "quelqu'un".
Énumérer le nom des ordinateurs du réseau et leurs partages respectifs, çà
je sais faire, mais ce n'est pas ma préoccupation ici.

Mon seul espoir était a priori dans "NetWkstaUserEnum", mais cette fonction
est bugguée (AMHA), car j'ai constaté qu'elle continue à énumèrer
l'utilisateur ayant ouvert une session même après qu'il ait clos cette
session! (j'ai vérifié plusieurs fois sur différentes machines, sous W2K et
XP)

Et ce n'est pas une erreur de ma part, car j'ai constaté le MÊME défaut avec
un logiciel tel que "Ideal Administration" !

--------------------------------------------------------
Dans le message news: ,
Patrick D. <patrickr.dubois.don' s'est ainsi exprimé:

[...]
surtout qu'un logiciel comme Hyena le fait sans problèmes



Merci de me répondre mais ... Où est-ce que Hyena le fait ?
Hyena n'affiche nullement l'utilisateur ayant ouvert une session locale!
(ou alors - je n'ai pourtant pas encore commencé le réveillon ! - je suis
bigleux! ;-) )

Dans l'item "Sessions", on a la liste des connexions externes ("net use
...")

Le seul moyen pour connaitre cela dans Hyena, c'est de faire comme moi, à
l'aide de WMI, Win32_Process, filtrer sur explorer, appeler la méthode
GetOwner, ..., lourdingue !



C'est quand même un comble que Microsoft n'ait prévu aucune fonction pour
cela ... !
Çà m'énerrrrrrvve !!!
(plus par principe puisque ma méthode "WMI" remplit bien son rôle..)

Encore merci de vous être penché sur mon pb, même si celà ne l'a pas résolu
...

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*
Avatar
Patrick D.
On Fri, 31 Dec 2004 16:43:11 +0100, Jean-Claude BELLAMY
wrote:

surtout qu'un logiciel comme Hyena le fait sans problèmes



Merci de me répondre mais ... Où est-ce que Hyena le fait ?
Hyena n'affiche nullement l'utilisateur ayant ouvert une session locale!
(ou alors - je n'ai pourtant pas encore commencé le réveillon ! - je suis
bigleux! ;-) )

Dans l'item "Sessions", on a la liste des connexions externes ("net use
...")

Le seul moyen pour connaitre cela dans Hyena, c'est de faire comme moi, à
l'aide de WMI, Win32_Process, filtrer sur explorer, appeler la méthode
GetOwner, ..., lourdingue !



C'est quand même un comble que Microsoft n'ait prévu aucune fonction pour
cela ... !
Çà m'énerrrrrrvve !!!
(plus par principe puisque ma méthode "WMI" remplit bien son rôle..)

Encore merci de vous être penché sur mon pb, même si celà ne l'a pas
résolu
...





Hyena ( au moins) 6.2 le fait
clic-droit sur l'ordinateur 'view logged on users'.
vu le message d'erreur que j'ai sur une machine maison en workgroup, alors
que mon portable est en domaine, on dirait que c'est une lecture de la
Registry
SystemsTools fournit un utilitaire en ligne de commande, gratuit, NETUSERS

OK c'est ça, le service RemoteRegistry est stoppé sur cette machine , donc
l'erreur est
**********************************************
C:My Download Files>netusers Brett

Connecting to BRETT...
Error 53 opening BRETTPIPEwinreg

The network path was not found.
************************************************

service RemoteRegistry démarré, Hyena me donne
************************************************
BRETT AUTORITE NTSERVICE LOCAL 31/12/2004 16:55:14
BRETT AUTORITE NTSERVICE RÉSEAU 31/12/2004 16:55:12
BRETT BRETTDuboisP 31/12/2004 16:55:23
BRETT AUTORITE NTSYSTEM 31/12/2004 16:55:05
************************************************


De rien, c'était un plaisir

Cordialement

Patrick




--
* enlevez '.don't.spam' et '.invalid' de mon adresse eMail si vous voulez
m'écrire *
* Donne un poisson à un homme, il aura à manger pour un jour
* Apprends-lui à pêcher, il aura à manger pour tous les jours de sa vie *
Avatar
Patrick D.
Suite

ok, j'ai ouvert netusers.exe dans un éditeur de texte, et là, on voit les
fonctions utilisées.
à partir de là, une petite recherche Internet m'a conduit à

http://www.thecodeproject.com/system/logonsessions.asp

http://msdn.microsoft.com/library/en-us/secauthn/security/lsaenumeratelogonsessions.asp
http://msdn.microsoft.com/library/en-us/secauthn/security/lsagetlogonsessiondata.asp

toujours un plaisir ...


--
* enlevez '.don't.spam' et '.invalid' de mon adresse eMail si vous voulez
m'écrire *
* Donne un poisson à un homme, il aura à manger pour un jour
* Apprends-lui à pêcher, il aura à manger pour tous les jours de sa vie *
Avatar
Jean-Claude BELLAMY
Dans le message news: ,
Patrick D. <patrickr.dubois.don' s'est ainsi exprimé:

On Fri, 31 Dec 2004 16:43:11 +0100, Jean-Claude BELLAMY
wrote:

surtout qu'un logiciel comme Hyena le fait sans problèmes



Merci de me répondre mais ... Où est-ce que Hyena le fait ?
Hyena n'affiche nullement l'utilisateur ayant ouvert une session
locale! (ou alors - je n'ai pourtant pas encore commencé le
réveillon ! - je suis bigleux! ;-) )


[...]



Hyena ( au moins) 6.2 le fait
clic-droit sur l'ordinateur 'view logged on users'.


je suis donc bigleux !!!
Effectivement, je n'avais pas pensé au menu contextuel sur l'ordi
sélectionné.


vu le message d'erreur que j'ai sur une machine maison en workgroup,
alors que mon portable est en domaine, on dirait que c'est une
lecture de la Registry



SystemsTools fournit un utilitaire en ligne de commande, gratuit,
NETUSERS



Merci pour l'info...
j'ai vu ..

Je l'ai examiné avec Dependency Walker : rien d'extraordinaire apparemment.
Il faut appel à NetAPI32 ..
J'ai vu que certaines fonctions ne sont pas documentées.
p.ex. toutes celles qui commencent par "I_Net...."
telle que "I_NetLogonControl" ..

çà doit être quelque part ...Mais où ?
M'énerve ! ;-)


Encore merci, et bonne année 2005 !




--
--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*
Avatar
Christian ASTOR
Patrick D. wrote:

surtout qu'un logiciel comme Hyena le fait sans problèmes



Hyena utilise la même méthode que M. Russinovich
( http://www.sysinternals.com/files/PsLoggedonSrc.zip )
(RegConnectRegistry(), conversion SID ...)
Avatar
Jean-Claude BELLAMY
Dans le message news:41d9a90f$0$23332$ ,
Christian ASTOR s'est ainsi exprimé:

Patrick D. wrote:

surtout qu'un logiciel comme Hyena le fait sans problèmes



Hyena utilise la même méthode que M. Russinovich
( http://www.sysinternals.com/files/PsLoggedonSrc.zip )
(RegConnectRegistry(), conversion SID ...)



Super !
Comment n'y ai-je pas pensé plus tôt !
J'ai adapté tout çà en Delphi (je m'étais déjà fait un ensemble de
procédures d'accès distant BDR, et de gestion des SID), çà marche au poil
...

Merci ...

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*