Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

API Récupérer le nom d'une session windows distante

13 réponses
Avatar
B.Cerede
Bonjour,

Je cherche comment récupérer le nom d'une session ouverte sur une
machine distante. Je n'ai pour le moment rien trouvé la dessus.

Si quelqu'un a une idée ça serais cool ;)

Merci.

10 réponses

1 2
Avatar
Jean-Claude BELLAMY
"B.Cerede" a écrit dans le message de
news:gn5vhe$iuk$
Bonjour,

Je cherche comment récupérer le nom d'une session ouverte sur une machine
distante. Je n'ai pour le moment rien trouvé la dessus.

Si quelqu'un a une idée ça serais cool ;)



Sauf nouveauté qui m'aurait échappé, il n'y a rien de prévu par défaut pour
faire cela.

Moi aussi j'ai été confronté à cette question.
J'ai trouvé une solution un peu "bourrin", faisant appel à WMI.

Et pour voir tout de suite ce que çà donne, je l'ai implantée dans un script
VBS ("GetSessionUser.vbs", brut de décoffrage!)

Son principe est le suivant :
J'énumère les processus "explorer.exe" sur la machine distante.
En effet, si une session est ouverte, il y a forcément comme processus actif
au moins le "shell", c'est à dire "explorer.exe".

NB: J'ai exclu le cas où Windows aurait été configuré avec un autre shell,
car là on passe dans l'exotisme!!!
Cela peut néanmoins se résoudre, en testant au préalable le contenu de la
clef de la BDR
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows
NTCurrentVersionWinlogonShell
et on remplace dans le script "explorer.exe" par cette valeur.

Ensuite, à partir de l'objet processus lié à "explorer.exe", je recueille à
l'aide de la méthode "GetOwner" la propriété "user", laquelle, comme son nom
l'indique, contient le nom du compte qui a lancé le processus.

----------- couper ici -----------
on error resume next
Set Args = WScript.Arguments
Set Network = WScript.CreateObject("WScript.Network")
nbargs=args.count
UserName=""
Password=""
If nbargs =3 Then
Computer = UCase(Args(0))
UserName=Args(1)
Password=Args(2)
else
Computer = Network.ComputerName
UserName=""
Password=""
end if

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
If Err.Number then
Wscript.Echo( "Erreur 0x" & CStr(Hex(Err.Number)) & _
" survenue dans la création de l'objet locator." )
If Err.Description <> "" Then Wscript.Echo( "Description: " &
Err.Description & "." )
Err.Clear
wscript.quit
End If

NameSpace="rootCIMV2"
Set ObjService = objLocator.ConnectServer(Computer, NameSpace, UserName,
Password)
If Err.Number then
msg="Erreur 0x" & CStr(Hex(Err.Number)) & " survenue dans la connexion à
" & Computer
If Err.Description <> "" Then msg=msg & " : " & Err.Description
wscript.echo msg
wscript.quit
End If

ObjService.Security_.impersonationlevel = 3
Set ServiceSet=ObjService.ExecQuery("SELECT * FROM Win32_Process where
name='explorer.exe'")
For each Process in ServiceSet
Process.GetOwner user,domain
wscript.echo "Session sur " & Computer & " ouverte par " & user
Next
----------- couper ici -----------

On passe en paramètres à ce script le nom ou l'adresse IP suivi d'un nom de
compte admin et son password de la machine distante.
Sans paramètres, la machine locale est retenue (dans ce cas on ne doit pas
lui passer de nom de compte et password)

PS: cette méthode n'est pas "parfaite" :
- Si la machine distante a désactivé l'accès distant au
registre + a utilisé un autre shell, on aura du mal a
avoir l'info (il faudrait alors redémarrer ce service à
distance, ...)
- si l'OS est du niveau de XP PRO ou Media Center,
donc permettant le "Remote Desktop" , on aura le compte
distant et non le compte local initial
- si l'utilisateur a effectué un basculement rapide d'utilisateur,
on aura plusieurs réponses.

Mais cela peut te donner des idées ...

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
Avatar
B.Cerede
Ah oui en effet c'est assez bourrin!

J'aurai voulut le faire directement en C. C'est dommage que l'on ne
puisse pas le faire :( Je n'ai pas forcément accès à un compte Admin,
donc ça se complique :(
Avatar
Christian ASTOR
B.Cerede wrote:

Je cherche comment récupérer le nom d'une session ouverte sur une
machine distante. Je n'ai pour le moment rien trouvé la dessus.

Si quelqu'un a une idée ça serais cool ;)



RegConnectRegistry() sur HKEY_USERS + NetSessionEnum() ne convient-il pas ?
(comme le fait PsLoggedOn)
Avatar
B.Cerede
Le problème avec NetSessionEnum() c'est comment savoir quel est
l'utilisateur qui est connecté actuellement.
Avatar
Christian ASTOR
B.Cerede wrote:
Le problème avec NetSessionEnum() c'est comment savoir quel est
l'utilisateur qui est connecté actuellement.



Avec RegConnectRegistry() sur HKEY_USERS
Avatar
B.Cerede
Avatar
Jean-Claude BELLAMY
"Christian ASTOR" a écrit dans le message de
news:4996a78b$0$28671$
B.Cerede wrote:

Je cherche comment récupérer le nom d'une session ouverte sur une machine
distante. Je n'ai pour le moment rien trouvé la dessus.
Si quelqu'un a une idée ça serais cool ;)



RegConnectRegistry() sur HKEY_USERS + NetSessionEnum() ne convient-il pas
?
(comme le fait PsLoggedOn)




Non, le résultat n'est pas fiable !
(j'ai essayé !!!)
Christian, nous avions déjà discuté du sujet en décembre 2004 !

J'ai retrouvé une appli de Delphi que j'avais écrite (en mode console)

Elle est en 2 parties, qui font appel respectivement à :
- NetSessionEnum
- NetWkstaUserEnum


Et voila les résultats sur différentes machines :
____________________________________
(une seule session "BELLAMY" ouverte sur cette machine sous XP PRO)
enumsession grandbassam
*** Méthode appelant "NetSessionEnum" ***
1 enregistrement(s)
Machine 192.168.0.110 / compte BELLAMY

*** Méthode appelant "NetWkstaUserEnum" ***
3 enregistrement(s)
User GRANDBASSAM$ / domain MAPLENET / server
User BELLAMY / domain GRANDBASSAM / server GRANDBASSAM
User __vmware_user__ / domain GRANDBASSAM / server GRANDBASSAM
____________________________________
(une session "MARGE" ouverte sur cette machine sous XP PRO
enumsession yeelen
*** Méthode appelant "NetSessionEnum" ***
2 enregistrement(s)
Machine 127.0.0.1 / compte MARGE
Machine 192.168.0.110 / compte BELLAMY

*** Méthode appelant "NetWkstaUserEnum" ***
2 enregistrement(s)
User YEELEN$ / domain MAPLENET / server
User MARGE / domain YEELEN / server YEELEN
____________________________________
(une session "BELLAMY" et une session "HOMER" ouvertes sur cette machine
sous XP PRO)
enumsession mezin
*** Méthode appelant "NetSessionEnum" ***
1 enregistrement(s)
Machine 192.168.0.110 / compte BELLAMY

*** Méthode appelant "NetWkstaUserEnum" ***
3 enregistrement(s)
User MEZIN$ / domain MAPLENET / server
User BELLAMY / domain MEZIN / server MEZIN
User HOMER / domain MEZIN / server MEZIN
____________________________________
(une session "BELLAMY" et une session "HOMER" ouvertes sur cette machine
sous SEVEN)
enumsession nerac
*** Méthode appelant "NetSessionEnum" ***
1 enregistrement(s)
Machine 192.168.0.110 / compte BELLAMY

*** Méthode appelant "NetWkstaUserEnum" ***
7 enregistrement(s)
User Administrator / domain NERAC / server NERAC
User Administrator / domain NERAC / server NERAC
User Administrator / domain NERAC / server NERAC
User Administrator / domain NERAC / server NERAC
User HOMER / domain NERAC / server NERAC
User BELLAMY / domain NERAC / server NERAC
User BELLAMY / domain NERAC / server NERAC
____________________________________

Conclusion :
"NetSessionEnum" affiche uniquement les montages réseau effectués depuis une
AUTRE machine (Poudenas, adr IP 192.168.0.110)
Donc les résultats ne correspondent pas du tout à ce qui est cherché ..

"NetWkstaUserEnum" affiche bien les comptes ayant ouvert une session, mais
... un peu trop !
(en particulier en ce qui concerne la machine sous Seven, je ne pige pas
cette redondance!)

L'exécutable et le code source sont disponibles ici :
http://www.cijoint.fr/cj200902/cijEbuFP0I.zip


--
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
Jean-Claude BELLAMY wrote:

Non, le résultat n'est pas fiable !
(j'ai essayé !!!)



Pour NetSessionEnum() OK, mais pour RegConnectRegistry(), ça marche sur
les tests que j'ai faits.
Et pour "B. Cerede", il faut s'inspirer/copier le code source de
PsLoggedOn, fonction DisplayLocalLogons() pour passer du Sid au Username
(on peut utiliser aussi ConvertStringSidToSid() pour la partie "Convert
the textual SID into a binary SID")
Avatar
B.Cerede
Ou puis je trouver le source de PsLoggedOn?

Merci ;)
Avatar
Christian ASTOR
B.Cerede wrote:

Ou puis je trouver le source de PsLoggedOn?

Merci ;)



Par ex : http://tinyurl.com/cqjd8u
1 2