Comment puis-je récupérer l'ID de session à partir de la ligne de commande?

26

Comment puis-je récupérer l'ID de session utilisateur actuel via la ligne de commande Windows?

Dans la liste des tâches sous l'onglet utilisateurs, chaque utilisateur est associé à un ID de session. Je souhaite récupérer cela via la ligne de commande afin de pouvoir l'utiliser pour une application distante.

Négatif
la source
Je ne sais pas ce que vous entendez par ID de session?
EBGreen
Dans la liste des tâches sous l'onglet utilisateurs, chaque utilisateur est associé à un ID de session. Je souhaite récupérer cela via la ligne de commande afin de pouvoir l'utiliser pour une application distante.
Négatif le
voir aussi superuser.com/questions/123242/…
matt wilkie
%% G serait si vous l'appeliez à partir d'un lot,% G si directement depuis la ligne de commande

Réponses:

28

Ce n'est certainement pas le moyen le plus efficace, mais vous pouvez consulter les résultats de tasklist. Il affichera le nom et le numéro de session de chaque processus en cours d'exécution. Si vous êtes connecté localement, regardez l'ID de la session nommée "console".

d:\>tasklist

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0         24 K
System                           4 Services                   0      8,580 K
smss.exe                       316 Services                   0      1,500 K
...snip

Modifier :

Query Session récupérera l'ID de session:

d:\>query session
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           janedoe                   1  Active
 rdp-tcp                                 65536  Listen
Gary
la source
Je cherche à le récupérer via la ligne de commande.
Négatif le
1
À droite, à partir de la ligne de commande, tapez tasklist.
Gary
1
Hmm en fait vous pourriez être sur quelque chose ici. edit: tasklist / FI "imagename eq cmd.exe" / FO list Je prévois d'analyser cette sortie. Merci!
Négatif le
Ou je peux le faire. Nice
Négatif
tasklistest bon car il ne nécessite pas de version Pro / Ent OS. Vous pouvez également répertorier uniquement les sessions interactives en filtrant pour explorer.exe -tasklist /fi "imagename eq explorer.exe"
shawn
5
for /f "tokens=4 delims= " %%G in ('tasklist /FI "IMAGENAME eq tasklist.exe" /NH') do SET RDP_SESSION=%%G
echo Current RDP Session ID: %RDP_SESSION%
Oscar Beh
la source
1
La solution d'Oscar a réellement fonctionné pour moi, lorsque remplacé %% G par% G: pour / f "jetons = 4 delims ="% G dans ('tasklist / FI "IMAGENAME eq tasklist.exe" / NH') faire SET RDP_SESSION =% G
Paweł Stankowski
2
@ PawełStankowski: c'est la différence si vous l'exécutez à partir d'un fichier batch (%%) ou à partir de la console (%)
Thomas Weller
Notez que cela se casse dans le cas peu probable où plusieurs utilisateurs s'exécutent tasklisten même temps.
Matthew Lundberg
5

Celui - ci combine les aspects de la réponse de Gary et la réponse d'Oscar . Comme l'a noté Gary, la sortie de query sessionressemble à quelque chose comme

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           janedoe                   1  Active
 rdp-tcp                                 65536  Listen

ou, dans mon cas (en utilisant "Changer d'utilisateur")

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           gman                      1  Active
                   otherguy                  2  Disc

(Je n'ai pas configuré RDP, donc je ne peux pas tester avec.) Vraisemblablement, l'objectif de la question est de déterminer l'ID de la session actuellement active. Je suggère de rechercher dans la sortie de query session ce qui ressemble à la session en cours:

 for /f "tokens=2-4" %a in ('query session') do @if "%a"=="%username%" if "%c"=="Active" echo %b

qui attribue la 2ème, 3ème et 4ème mot (que nous espérons être le USERNAME, [SESSION] ID et STATE) de chaque ligne de la sortie query sessionà %a, %bet %c, respectivement, et fait ensuite rapport SESSION ID de la ligne où USERNAME est moi et STATE l'est Active.

Il s'avère que cela query sessionprend un usernameparamètre, donc ce qui précède peut être simplifié pour

 for /f "tokens=2-4" %a in ('query session %username%') do @if "%c"=="Active" echo %b

ou

for /f "tokens=3-4" %a in ('query session %username%') do @if "%b"=="Active" echo %a

Pour l'utiliser dans un script (fichier batch), vous voudrez peut-être dire

set MY_SESSION_ID=unknown
for /f "tokens=3-4" %%a in ('query session %username%') do @if "%%b"=="Active" set MY_SESSION_ID=%%a

en utilisant %%aet %%b(au lieu de %aet %b) parce que c'est dans un script. Vous pouvez probablement laisser de côté @ si le fichier de commandes entier est sous @echo off. L'initialisation unknownvous permet de gérer les erreurs (détecter s'il n'y a pas de ligne dans la sortie de query session cette correspondance). L'extension de la gestion des erreurs pour reconnaître et réagir s'il y a plusieurs lignes correspondantes dans la sortie de query session est laissée comme exercice.

G-Man dit «Réintègre Monica»
la source
Dans mon cas réel, s'il y a plusieurs sessions, elles auront toujours le même nom d'utilisateur. Mais ce n'est probablement pas typique.
Matthew Lundberg
@MatthewLundberg: Et l'état? Les sessions autres que la session actuelle sont-elles identifiées comme «actives»?
G-Man dit «Réinstalle Monica» le
Oui, ils seraient actifs. Il s'agit d'un OS serveur.
Matthew Lundberg
2

Contrairement au nom de session, l'ID de session n'est pas stocké dans une variable et n'est pas aussi facile d'accès. Je suis sûr qu'il y en a un, mais je ne peux pas penser à un outil de ligne de commande intégré qui fasse cela.

Cependant, j'ai écrit un petit fichier .exe (C #, .Net 4) qui fait cela.

Il affichera à la fois l'ID de session et l'aura également comme code de retour afin que vous puissiez l'utiliser dans une variété de scripts / techniques.

Lien vers un fichier sur MediaFire

William Hilsum
la source
1

Ceci est basé sur le code d'Oscar Beh.

tasklistaffichera le rapport de l'ID de session (et d'autres informations) pour toutes les instances d'un exécutable donné, y compris lui-même. Lorsque vous exécutez la commande, elle affichera votre identifiant de session. Le seul défaut potentiel de son code est qu'il ne vous informe pas s'il existe plusieurs instances du programme, ce qui peut entraîner le script à renvoyer des résultats incorrects.

Nous rapportons ici toutes les instances de tasklistpour nous assurer qu'aucune autre session n'exécute cette commande:

for /f "tokens=4 delims= " %%G in ('tasklist /FI "IMAGENAME eq tasklist.exe" /NH') do echo Session ID %%G

Si vous voyez deux ID de session signalés, réexécutez le script.

Matthew Lundberg
la source