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

¿Cómo puedo recuperar el ID de la sesión desde la línea de comandos?

¿Cómo puedo recuperar el ID de sesión del usuario actual a través de la línea de comandos de Windows?

En la lista de tareas bajo la pestaña de usuarios, cada usuario está asociado con un ID de sesión. Quiero recuperarlo a través de la línea de comandos para poder utilizarlo en una aplicación remota.

Respuestas (5)

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

Esta no es ciertamente la forma más eficiente, pero puede echar un vistazo a los resultados de tasklist. Se mostrará el nombre y el número de sesión de cada proceso en ejecución. Si está conectado localmente, mire el ID de la sesión llamada “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 recuperará el id de sesión:

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

Esto combina aspectos de la respuesta de Gary y de la respuesta de Oscar .  Como señaló Gary, la salida de query session parece algo así como

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

o, en mi caso (usando “Switch user”)

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

(no tengo RDP configurado, así que no puedo hacer pruebas con él. )  Presumiblemente la intención de la pregunta es determinar el ID de la sesión actualmente activa. Sugiero buscar en la salida de query session lo que parece ser la sesión actual:

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

que asigna la 2ª, 3ª y 4ª palabra (que esperamos que sean el USERNAME, el ID de [SESSION] y el STATE) de cada línea de la salida de query session a %a, %b y%c, respectivamente, y luego informa del ID de la sesión de la línea donde USERNAME es yo y STATE es Active.

Resulta que query session toma un parámetro username, así que lo anterior puede simplificarse a

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

Para usar esto en un script (archivo por lotes), podría decir

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 y %%b (en lugar de %a y %b) porque está en un script. Probablemente puede omitir el @ si todo el archivo por lotes está bajo @echo off. La inicialización a unknown le permite hacer el manejo de errores (detectar si no hay ninguna línea en la salida de query sessionque coincida).  Extender el manejo de errores para reconocer y reaccionar si hay múltiples líneas que coinciden en la salida de query sessionse deja como un ejercicio.

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 diferencia del nombre de la sesión, el ID de la sesión no se almacena en una variable y no es tan fácil de obtener. Estoy seguro de que hay uno, pero no puedo pensar en una herramienta de línea de comandos incorporada que haga esto.

Sin embargo, he escrito un pequeño archivo .exe (C#, .Net 4) que hace esto.

Mostrará el identificador de sesión, y también lo tendrá como código de retorno para que pueda utilizarlo en una variedad de scripts/técnicas. Enlace al archivo en MediaFire

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

Esto se basa en el código de Oscar Beh.

tasklist mostrará el informe del ID de sesión (y otra información) para todas las instancias de un determinado ejecutable, incluido él mismo. Mientras se ejecuta el comando, mostrará su ID de sesión. El único defecto potencial de su código es que no le informa si hay múltiples instancias del programa, lo que puede hacer que el script devuelva resultados incorrectos.

Aquí informamos de todas las instancias de tasklist para asegurar que no hay otra sesión ejecutando ese comando:

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

Si ve dos ID de sesión reportados, ejecute el script de nuevo.