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

24

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

Na lista de tarefas na 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.

Negativo
fonte
Não tenho certeza do que você quer dizer com ID de sessão?
EBGreen
Na lista de tarefas na 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.
Negative
veja também superuser.com/questions/123242/…
Matt Wilkie
%% G seria se você chamá-lo de um lote,% G se diretamente da linha de comando

Respostas:

27

Esta não é certamente a maneira mais eficiente, mas você pode dar uma olhada nos resultados tasklist. Ele exibirá o nome e a sessão # de cada processo em execução. Se você estiver logado localmente, observe 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 irá 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
Gary
fonte
Eu estou olhando para recuperá-lo via linha de comando.
Negative
1
Certo, na linha de comando, digite tasklist.
Gary
1
Hmm, na verdade você pode estar em algo aqui. edit: lista de tarefas / FI "imagename eq cmd.exe" / lista FO Eu planejo analisar essa saída. Obrigado!
Negative
Ou eu posso fazer isso. Nice
Negative
tasklisté bom porque não requer uma versão do sistema operacional Pro / Ent. Você também pode listar apenas sessões interativas filtrando para explorer.exe -tasklist /fi "imagename eq explorer.exe"
shawn
5

Este combina aspectos da resposta de Gary e a resposta de Oscar . Como observado por Gary, a saída query sessionparece 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

(Eu não tenho o RDP configurado, então não posso testar com ele.) Presumivelmente, a intenção da questão é determinar o ID da sessão atualmente ativa. Eu 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 2ª, 3ª e 4ª palavra (que esperamos ser o username, [SESSION] ID, e estaduais) de cada linha da saída de query sessiona %a, %be %c, respectivamente, e, em seguida, relatórios de sessão ID da linha onde USERNAME sou eu e STATE é Active.

Acontece que query sessionleva um usernameparâmetro, 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 %%ae %%b(em vez de %ae %b) porque está em um script. Você provavelmente pode deixar de fora @ se o arquivo de lote inteiro estiver sob @echo off. A inicialização unknownpermite que você faça o tratamento de erros (detectando se não há nenhuma linha na saída query session correspondente). Estender o tratamento de erros para reconhecer e reagir se houver várias linhas correspondentes na saída query session é deixado como um exercício.

G-Man
fonte
No meu caso do mundo real, se houver várias sessões, elas sempre terão o mesmo nome de usuário. Mas isso provavelmente não é típico.
Matthew Lundberg
@MatthewLundberg: Como sobre o estado? As sessões diferentes da atual são identificadas como "Ativas"?
G-Man
Sim, eles estariam ativos. É um sistema operacional de servidor.
Matthew Lundberg
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%
Oscar Beh
fonte
1
A solução de Oscar realmente funcionou para mim, quando substituído %% G por% G: por / f "tokens = 4 delims ="% G em ('tasklist / FI "IMAGENAME eq tasklist.exe" / NH') do SET RDP_SESSION =% G
Paweł Stankowski
2
@ PawełStankowski: essa é a diferença se você executá-lo a partir de um arquivo de lote (%%) ou do console (%)
Thomas Weller
Observe que isso ocorre no caso improvável de vários usuários estarem executando tasklistao mesmo tempo.
Matthew Lundberg
2

Ao contrário 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, eu 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

William Hilsum
fonte
1

Isto é baseado no código do Oscar Beh.

tasklistmostrará o relatório do 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 nós relatamos todas as instâncias de tasklistpara 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 relatados, execute o script novamente.

Matthew Lundberg
fonte