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

Jak mogę pobrać identyfikator sesji z wiersza poleceń?

Jak mogę pobrać identyfikator bieżącej sesji użytkownika za pomocą wiersza poleceń systemu windows?

Na liście zadań w zakładce użytkownicy, każdy użytkownik jest powiązany z identyfikatorem sesji. Chcę go pobrać za pomocą wiersza poleceń, aby móc go użyć w zdalnej aplikacji.

Odpowiedzi (5)

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

Z pewnością nie jest to najbardziej efektywny sposób, ale możesz spojrzeć na wyniki działania tasklist. Wyświetli on nazwę i session# każdego uruchomionego procesu. Jeśli jesteś zalogowany lokalnie, spójrz na ID dla sesji o nazwie “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 pobierze id sesji:

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

Łączy to aspekty odpowiedzi Gary'ego i odpowiedzi Oscara .  Jak zauważył Gary, wyjście query session wygląda jak

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

lub, w moim przypadku (używając “Switch user”)

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

(nie mam skonfigurowanego RDP, więc nie mogę z nim testować. )  Przypuszczalnie intencją pytania jest określenie identyfikatora aktualnie aktywnej sesji.   Proponuję przeszukanie wyjścia query session w poszukiwaniu czegoś, co wygląda na bieżącą sesję:

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

co przypisuje 2, 3 i 4 słowo (które, jak mamy nadzieję, jest USERNAME, [SESSION] ID i STATE) z każdego wiersza wyjścia query session do %a, %b i%c, odpowiednio, a następnie zgłasza SESSION ID z wiersza, w którym USERNAME to ja, a STATE to Active.

Okazuje się, że query session przyjmuje parametr username, więc powyższe można uprościć do

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

lub

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

Aby użyć tego w skrypcie (pliku wsadowym), możesz chcieć powiedzieć

set MY_SESSION_ID=unknown
for /f "tokens=3-4" %%a in ('query session %username%') do @if "%%b"=="Active" set MY_SESSION_ID=%%a

używając %%a i %%b (zamiast %a i %b), ponieważ jest to w skrypcie.   Prawdopodobnie możesz pominąć @, jeśli cały plik wsadowy jest poniżej @echo off. Inicjalizacja do unknown pozwala na obsługę błędów (wykrywanie, czy nie ma linii na wyjściu query session, która by pasowała).  Rozszerzenie obsługi błędów do rozpoznawania i reagowania, jeśli jest wiele pasujących linii na wyjściu query sessionjest pozostawione jako ćwiczenie.

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

W przeciwieństwie do Session Name, Session ID nie jest przechowywany w zmiennej i nie jest tak łatwo się do niego dostać. Jestem pewien, że istnieje, ale nie mogę sobie wyobrazić wbudowanego narzędzia wiersza poleceń, które to robi.

Jednak napisałem malutki plik .exe (C#, .Net 4), który to robi.

Będzie on zarówno wyświetlał id sesji, jak również będzie miał go jako kod zwrotny, dzięki czemu można go używać w różnych skryptach / technikach. Link do pliku na MediaFire

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

Jest to oparte na kodzie od Oscara Beh.

tasklist pokaże identyfikator sesji (i inne informacje) dla wszystkich instancji danego programu wykonywalnego, włączając w to jego samego. Podczas wykonywania polecenia, pokaże ono id twojej sesji. Jedyną potencjalną wadą jego kodu jest to, że nie informuje on o istnieniu wielu instancji programu, co może spowodować, że skrypt zwróci błędne wyniki.

Tutaj zgłaszamy wszystkie przypadki tasklist, aby upewnić się, że nie ma innej sesji wykonującej to polecenie:

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

Jeśli widzisz zgłoszone dwa ID sesji, uruchom skrypt ponownie.