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

Como posso recuperar o ID da Sessão a partir da linha de comando?

Como posso recuperar o ID da sessão do utilizador actual através da linha de comando do windows?

Na lista de tarefas sob o separador dos utilizadores, cada utilizador é associado a um ID de sessão. Quero recuperá-lo através da linha de comando para poder utilizá-lo para uma aplicação remota.

Respostas (5)

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

Esta não é certamente a forma mais eficiente, mas pode dar uma vista de olhos aos resultados de tasklist. Mostrará o nome e a sessão# de cada processo em curso. Se estiver logado localmente, então olhe para a identificação da sessão chamada “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

Edit:

Query Session recuperará o ID da sessão:

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

Isto combina aspectos de Gary’s answer e Oscar’s answer .  Como notado por Gary, a saída de query session parece algo como

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

ou, no meu caso (usando “Switch user”)

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

(não tenho o RDP configurado, por isso não posso testar com ele. )  presumivelmente a intenção da pergunta é determinar a identificação da sessão actualmente activa.   sugiro procurar a saída de query session para o que se parece com a sessão actual:

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

que atribui a 2ª, 3ª, e 4ª palavra (que esperamos ser o USERNAME, [SESSION] ID, e STATE) de cada linha da saída de query session a %a, %b, e %c, respectivamente, e depois reporta SESSION ID da linha onde USERNAME sou eu e STATE é Active.

Acontece que query session toma um parâmetro username, pelo que o anterior pode ser simplificado para

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
set MY_SESSION_ID=unknown
for /f "tokens=3-4" %%a in ('query session %username%') do @if "%%b"=="Active" set MY_SESSION_ID=%%a

Para utilizar isto num script (ficheiro batch), talvez seja melhor dizer

0x1&

utilizando %%a e %%b (em vez de %a e %b) porque está num script.   Provavelmente pode deixar de fora o @& se todo o ficheiro do lote estiver abaixo de @echo off. A inicialização para unknown& permite-lhe fazer a manipulação de erros (detectando se não há nenhuma linha na saída de query session que corresponda).  Estendendo a manipulação de erros para reconhecer e reagir se há múltiplas linhas correspondentes na saída de query sessionis deixado como um exercício.

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

Ao contrário do Nome da Sessão, o ID da Sessão não é armazenado numa variável e não é tão fácil de obter. Tenho a certeza de que existe uma, mas não consigo pensar numa ferramenta de linha de comando integrada que faça isto.

Contudo, escrevi um pequeno ficheiro .exe (C#, .Net 4) que faz isto.

Tanto mostrará o id da sessão, como também o terá como código de retorno para que possa utilizá-lo numa variedade de scripts/técnicas. Link para ficheiro no MediaFire

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

Isto é baseado no código de Oscar Beh.

tasklist mostrará o ID da sessão (e outras informações) para todas as instâncias de um determinado executável, incluindo ele próprio. Ao executar o comando, mostrará o seu ID de sessão. O único defeito potencial no seu código é que não o informa se existirem múltiplas instâncias do programa, o que pode fazer com que o script retorne resultados incorrectos.

Aqui relatamos todas as instâncias de tasklist para assegurar que não há outra sessão a correr esse comando:

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

Se vir duas IDs de sessão relatadas, execute novamente o script.