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

22

Como posso recuperar o ID da sessão do usuário atual por meio da linha de comando do Windows?

Na lista de tarefas da guia Usuários, cada usuário é associado a um ID de sessão. Eu quero recuperar isso via linha de comando para que eu possa usá-lo para um aplicativo remoto.

    
por Negative 29.06.2011 / 16:17

5 respostas

24

Esta não é certamente a maneira mais eficiente, mas você pode dar uma olhada nos resultados de tasklist . Ele exibirá o nome e a sessão # de cada processo em execução. Se você está logado localmente, então olhe para o ID da sessão chamada "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

Editar :

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
    
por 29.06.2011 / 16:24
4
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%
    
por 03.01.2013 / 15:52
3

Isso combina aspectos da resposta de Gary e resposta do Oscar . Como observado por Gary, a saída de query session é parecida com

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

ou, no meu caso (usando "Trocar usuário")

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

(Eu não tenho a configuração do RDP, por isso não posso testar com isso.) Presumivelmente, a intenção da questão é determinar o ID da sessão atualmente ativa. Sugiro pesquisar a saída de query session para o que parece ser a sessão atual:

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

que atribui a segunda, terceira e quarta palavra (que esperamos que seja o NOME DE USUÁRIO, [SESSÃO] ID e ESTADO) de cada linha da saída de query session a %a , %b e %c , respectivamente, e, em seguida, relata SESSIONID da linha onde USERNAME sou eu e STATE é Active .

Acontece que query session recebe um parâmetro username , então o acima 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

Para usar isso em um script (arquivo em lotes), você pode querer dizer

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 (em vez de %a e %b ) porque está em um script. Você provavelmente pode deixar de fora o @ se o arquivo de lote inteiro estiver abaixo de @echo off . A inicialização para unknown permite fazer tratamento de erros (detectando se não há linha na saída de query session que corresponde). Estendendo o tratamento de erros para reconhecer e reagir se houver várias linhas correspondentes na saída de query session é deixado como um exercício.

    
por 04.02.2016 / 23:21
2

Diferentemente do nome da sessão, o ID da sessão não é armazenado em uma variável e não é tão fácil de acessar. Tenho certeza de que existe um, mas não consigo pensar em uma ferramenta de linha de comando integrada que faça isso.

No entanto, escrevi um pequeno arquivo .exe (C #, .Net 4) que faz isso.

Ele exibirá o id da sessão e também o terá como o código de retorno para que você possa usá-lo em diversos scripts / técnicas.

Link para o arquivo no MediaFire

    
por 29.06.2011 / 16:28
1

Isso é baseado no código do 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 mesmo. Enquanto você está executando o comando, ele mostrará o seu id de sessão. O único defeito em potencial em seu código é que ele não informa se há várias instâncias do programa, o que pode fazer com que o script retorne resultados incorretos.

Aqui, informamos todas as instâncias de tasklist para garantir que não haja outra sessão executando esse comando:

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

Se você ver dois IDs de sessão informados, execute o script novamente.

    
por 04.02.2016 / 23:08