Comment puis-je récupérer l'ID de session de l'utilisateur actuel via la ligne de commande Windows?
Dans la liste des tâches de l'onglet Utilisateurs, chaque utilisateur est associé à un identifiant de session. Je souhaite récupérer ceci via une ligne de commande afin de pouvoir l'utiliser pour une application distante.
Ce n'est certainement pas le moyen le plus efficace, mais vous pouvez jeter un coup d'œil aux 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, examinez 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
Éditer :
Query Session
récupérera l'identifiant de session:
d:\>query session
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console janedoe 1 Active
rdp-tcp 65536 Listen
Cela combine les aspects de la réponse de Gary et de la réponse d’Oscar . Comme l'a noté Gary, le résultat de query session
ressemble à 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 de configuration RDP, donc je ne peux pas tester avec.) Vraisemblablement, le but 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 assigne les 2e, 3e et 4e mots (nous espérons être le nom d'utilisateur, l'identifiant [SESSION] et l'état) de chaque ligne de la sortie de query session
à %a
, %b
et %c
, respectivement, puis renvoie SESSIONID de la ligne où USERNAME est moi et STATE est Active
.
Il s'avère que query session
prend un paramètre username
, ce qui permet de simplifier ce qui précède
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 utiliser cela dans un script (fichier de commandes), 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 %%a
et %%b
(au lieu de %a
et %b
) car il s’agit d’un script. Vous pouvez probablement omettre le @
si l'intégralité du fichier de commandes est sous @echo off
. L'initialisation à unknown
vous permet de gérer les erreurs (détecter s'il n'y a aucune ligne dans la sortie de query session
qui correspond). L'extension de la gestion des erreurs pour reconnaître et réagir s'il existe plusieurs lignes de correspondance dans la sortie de query session
est laissée sous forme d'exercice.
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%
Contrairement au nom de session, l'ID de session n'est pas stocké dans une variable et n'est pas aussi facile à obtenir. Je suis sûr qu'il y en a un, mais je ne peux pas penser à un outil en ligne de commande intégré qui fait cela.
Cependant, j'ai écrit un fichier .exe minuscule (C #, .Net 4) qui fait cela.
Il affichera à la fois l’identifiant de session et l’aura comme code de retour afin que vous puissiez l’utiliser dans divers scripts/techniques.
Ceci est basé sur le code d'Oscar Beh.
tasklist
affichera report 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, votre identifiant de session s’affiche. 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 renvoi de résultats incorrects par le script.
Nous rapportons ici toutes les instances de tasklist
pour 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 deux identifiants de session sont signalés, exécutez à nouveau le script.