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

26

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

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

Negativo
fuente
No estoy seguro de lo que quieres decir con ID de sesión.
EBGreen
En la lista de tareas en la pestaña de usuarios, cada usuario está asociado con una ID de sesión. Quiero recuperar esto a través de la línea de comandos para poder usarlo para una aplicación remota.
Negativo
ver también superuser.com/questions/123242/...
Wilkie mate
%% G sería si lo llama desde un lote,% G si directamente desde la línea de comando

Respuestas:

28

Ciertamente, esta no es la forma más eficiente, pero puede ver los resultados tasklist. Mostrará el nombre y la sesión # de cada proceso en ejecución. Si ha iniciado sesión localmente, mire la ID de la sesión llamada "consola".

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

Editar :

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
Gary
fuente
Estoy buscando recuperarlo a través de la línea de comando.
Negativo
1
Derecha, desde la línea de comando, escriba tasklist.
Gary
1
Hmm, en realidad podrías estar haciendo algo aquí. editar: lista de tareas / FI "nombre de imagen eq cmd.exe" / FO lista planeo analizar esta salida. ¡Gracias!
Negativo el
O puedo hacer eso. Niza
Negativo
tasklistes bueno porque no requiere una versión Pro / Ent OS. También puede enumerar solo sesiones interactivas filtrando para 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
fuente
1
La solución de Oscar realmente funcionó para mí, cuando se reemplazó %% G con% G: para / f "tokens = 4 delims ="% G en ('tasklist / FI "IMAGENAME eq tasklist.exe" / NH') do SET RDP_SESSION =% G
Paweł Stankowski
2
@ PawełStankowski: esa es la diferencia si lo ejecuta desde un archivo por lotes (%%) o desde una consola (%)
Thomas Weller
Tenga en cuenta que esto se rompe en el improbable caso de que varios usuarios se estén ejecutando tasklistal mismo tiempo.
Matthew Lundberg
5

Esto combina aspectos de la respuesta de Gary y la respuesta de Oscar . Como señaló Gary, la salida de se query sessionparece a

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

o, en mi caso (usando "Cambiar usuario")

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

(No tengo configurado RDP, por lo que no puedo probarlo). Presumiblemente, la intención de la pregunta es determinar la ID de la sesión actualmente activa. Sugiero buscar en la salida de query session lo que parece 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 segunda, tercera y cuarta palabra (que esperamos ser el NOMBRE DE USUARIO, [SESIÓN] Identificación y estado) de cada línea de la salida de query sessiona %a, %by %c, respectivamente, y luego informa de ID de sesión desde la línea donde USERNAME soy yo y STATE es Active.

Resulta que query sessiontoma un usernameparámetro, por lo que lo anterior se puede simplificar 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), es posible que desee 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 %%ay %%b(en lugar de %ay %b) porque está en un script. Probablemente pueda omitir @ si todo el archivo por lotes está debajo @echo off. La inicialización le unknownpermite manejar errores (detectar si no hay línea en la salida de query session esas coincidencias). Extender el manejo de errores para reconocer y reaccionar si hay varias líneas coincidentes en la salida de query session se deja como ejercicio.

G-Man dice 'restablecer a Monica'
fuente
En mi caso del mundo real, si hay varias sesiones, siempre tendrán el mismo nombre de usuario. Pero esto probablemente no sea típico.
Matthew Lundberg
@MatthewLundberg: ¿Qué tal ESTADO? ¿Las sesiones distintas de la actual se identifican como "Activas"?
G-Man dice 'Reincorporar a Monica'
Sí, estarían activos. Es un sistema operativo del servidor.
Matthew Lundberg
2

A diferencia del Nombre de sesión, la ID de sesión no se almacena en una variable y no es tan fácil de acceder. Estoy seguro de que hay uno, pero no puedo pensar en una herramienta de línea de comandos integrada que haga esto.

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

Mostrará el ID de la sesión y también lo tendrá como código de retorno para que pueda usarlo en una variedad de scripts / técnicas.

Enlace al archivo en MediaFire

William Hilsum
fuente
1

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

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

Aquí informamos todas las instancias tasklistpara asegurarnos de que no haya 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 informados, ejecute el script nuevamente.

Matthew Lundberg
fuente