2011-06-29 14:17:06 +0000 2011-06-29 14:17:06 +0000
27
27

Come posso recuperare l'ID della sessione dalla riga di comando?

Come posso recuperare l'ID di sessione dell'utente corrente tramite la riga di comando di Windows?

Nella tasklist sotto la scheda utenti, ogni utente è associato a un ID di sessione. Voglio recuperarlo tramite la riga di comando in modo da poterlo usare per un'applicazione remota.

Risposte (5)

29
29
29
2011-06-29 14:24:34 +0000

Questo non è certamente il modo più efficiente, ma potete dare un'occhiata ai risultati di tasklist. Mostrerà il nome e il numero di sessione di ogni processo in esecuzione. Se sei loggato in locale allora guarda l'ID della sessione chiamata “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

Edit:

Query Session recupererà l'ID della sessione:

d:\>query session
 SESSIONNAME USERNAME ID STATE TYPE DEVICE
 services 0 Disc
>console janedoe 1 Active
 rdp-tcp 65536 Listen
6
6
6
2016-02-04 22:21:53 +0000

Questo combina aspetti di risposta di Gary e risposta di Oscar .  Come notato da Gary, l'output di query session sembra qualcosa come

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

o, nel mio caso (usando “Switch user”)

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

(non ho RDP impostato, quindi non posso provare con esso. )  Presumibilmente l'intento della domanda è quello di determinare l'ID della sessione attualmente attiva.   Suggerisco di cercare nell'output di query session quello che sembra la sessione corrente:

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

che assegna la seconda, terza e quarta parola (che speriamo siano USERNAME, [SESSION] ID, e STATE) da ogni linea dell'output di query session a %a, %b, e%c, rispettivamente, e poi riporta SESSION ID dalla linea dove USERNAME è io e STATE è Active.

Si scopre che query session prende un parametro username, quindi quanto sopra può essere semplificato in

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

o

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

Per usare questo in uno script (file batch), potresti voler 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

usando %%a e %%b (invece di %a e %b) perché è in uno script. Si può probabilmente tralasciare lo @ se l'intero file batch è sotto @echo off. L'inizializzazione a unknown ti permette di fare la gestione degli errori (rilevando se non c'è nessuna linea nell'output di query session che corrisponde).  Estendere la gestione degli errori per riconoscere e reagire se ci sono multiple linee corrispondenti nell'output di query sessionè lasciato come esercizio.

5
5
5
2013-01-03 14:52:01 +0000
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%
2
2
2
2011-06-29 14:28:57 +0000

A differenza del Session Name, il Session ID non è memorizzato in una variabile e non è così facile da raggiungere. Sono sicuro che ce ne sia uno, ma non riesco a pensare a uno strumento a riga di comando che faccia questo.

Tuttavia, ho scritto un piccolo file .exe (C#, .Net 4) che fa questo.

Mostrerà l'id della sessione e lo avrà anche come codice di ritorno in modo da poterlo usare in una varietà di script/tecniche. Link al file su MediaFire

1
1
1
2016-02-04 22:08:48 +0000

Questo è basato sul codice di Oscar Beh.

tasklist mostrerà l'ID di sessione (e altre informazioni) per tutte le istanze di un dato eseguibile, incluso se stesso. Mentre stai eseguendo il comando, mostrerà il tuo ID di sessione. L'unico potenziale difetto del suo codice è che non vi informa se ci sono più istanze del programma, il che può far sì che lo script restituisca risultati errati.

Qui riportiamo tutte le istanze di tasklist per assicurarci che non ci sia un'altra sessione che esegue quel comando:

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

Se vedete riportati due ID di sessione, eseguite nuovamente lo script.