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


26

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

Nell'elenco delle attività nella scheda utenti, ogni utente è associato a un ID sessione. Voglio recuperarlo tramite riga di comando in modo da poterlo utilizzare per un'applicazione remota.


Non sono sicuro di cosa intendi per ID sessione?
EBGreen

Nell'elenco delle attività nella scheda utenti, ogni utente è associato a un ID sessione. Voglio recuperarlo tramite riga di comando in modo da poterlo utilizzare per un'applicazione remota.
Negativo


%% G sarebbe se lo chiami da un batch,% G se direttamente dalla riga di comando

Risposte:


28

Questo non è certamente il modo più efficiente, ma puoi dare un'occhiata ai risultati di tasklist. Verranno visualizzati il ​​nome e il numero di sessione di ciascun processo in esecuzione. Se hai effettuato l'accesso localmente, cerca l'ID per la sessione denominata "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

Modifica :

Query Session recupererà l'id di sessione:

d:\>query session
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           janedoe                   1  Active
 rdp-tcp                                 65536  Listen

Sto cercando di recuperarlo tramite riga di comando.
Negativo

1
A destra, dalla riga di comando, digitare tasklist.
Gary,

1
Hmm in realtà potresti essere su qualcosa qui. modifica: elenco attività / FI "imagename eq cmd.exe" / elenco FO Ho intenzione di analizzare questo output. Grazie!
Negativo

O posso farlo. Nizza
Negativo

tasklistè buono perché non richiede una versione del sistema operativo Pro / Ent. Puoi anche elencare solo le sessioni interattive filtrando per explorer.exe -tasklist /fi "imagename eq explorer.exe"
shawn il

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%

1
La soluzione di Oscar in realtà ha funzionato per me, quando ha sostituito %% G con% G: for / f "token = 4 delims ="% G in ('tasklist / FI "IMAGENAME eq tasklist.exe" / NH') do SET RDP_SESSION =% G
Paweł Stankowski il

2
@ PawełStankowski: questa è la differenza se lo esegui da un file batch (%%) o dalla console (%)
Thomas Weller

Si noti che ciò si interrompe nell'improbabile evento in cui più utenti siano in esecuzione tasklistcontemporaneamente.
Matthew Lundberg,

5

Questo combina aspetti della risposta di Gary e della risposta di Oscar . Come notato da Gary, l'output di query sessionsembra qualcosa di simile

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

o, nel mio caso (usando "Cambia utente")

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

(Non ho RDP impostato, quindi non posso testarlo.) Presumibilmente l'intento della domanda è determinare l'ID della sessione attualmente attiva. Suggerisco di cercare l'output di query session quella 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 il 2 °, 3 ° e 4 ° di parola (che speriamo di essere il NOME UTENTE, [SESSIONE] ID, e statali) da ogni riga della produzione di query sessiona %a, %be %c, rispettivamente, e poi riporta SESSION ID dalla linea in cui USERNAME sono io e STATE lo è Active.

Si scopre che query sessionaccetta un usernameparametro, quindi quanto sopra può essere semplificato

 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 usarlo 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 %%ae %%b(invece di %ae %b) perché è in uno script. Probabilmente puoi tralasciare @ se l'intero file batch è sotto @echo off. L'inizializzazione unknownconsente di eseguire la gestione degli errori (rilevando se non esiste alcuna riga nell'output di query session tali corrispondenze). L'estensione della gestione degli errori per riconoscere e reagire se ci sono più righe corrispondenti nell'output di query session viene lasciata come esercizio.


Nel mio caso reale, se ci sono più sessioni, avranno sempre lo stesso nome utente. Ma questo probabilmente non è tipico.
Matthew Lundberg,

@MatthewLundberg: Che ne dici di STATE? Le sessioni diverse da quella corrente sono identificate come "Attive"?
G-Man dice "Ripristina Monica" il

Sì, sarebbero attivi. È un sistema operativo server.
Matthew Lundberg,

2

A differenza del Nome sessione, l'ID sessione non è memorizzato in una variabile e non è così facile da raggiungere. Sono sicuro che ce n'è uno, ma non riesco a pensare a uno strumento da riga di comando integrato che lo faccia.

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

Visualizzerà entrambi l'id della sessione e lo avrà anche come codice di ritorno in modo da poterlo utilizzare in una varietà di script / tecniche.

Link al file su MediaFire


1

Questo si basa sul codice di Oscar Beh.

tasklistmostrerà riportare l'ID sessione (e altre informazioni) per tutte le istanze di un determinato eseguibile, incluso se stesso. Mentre esegui il comando, mostrerà il tuo ID di sessione. L'unico potenziale difetto nel suo codice è che non ti informa se ci sono più istanze del programma, che possono far sì che lo script restituisca risultati errati.

Qui riportiamo tutte le istanze di tasklistper 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 vengono visualizzati due ID sessione, eseguire nuovamente lo script.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.