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

26

Jak mogę pobrać bieżący identyfikator 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ę to pobrać za pomocą wiersza polecenia, aby móc używać go do aplikacji zdalnej.

Negatywny
źródło
Nie jestem pewien, co masz na myśli przez identyfikator sesji?
EBGreen
Na liście zadań w zakładce Użytkownicy każdy użytkownik jest powiązany z identyfikatorem sesji. Chcę to pobrać za pomocą wiersza polecenia, aby móc używać go do aplikacji zdalnej.
Negatywne
zobacz także superuser.com/questions/123242/…
matt wilkie,
%% G będzie, jeśli wywołasz go z partii,% G, jeśli bezpośrednio z wiersza poleceń

Odpowiedzi:

28

Z pewnością nie jest to najbardziej efektywny sposób, ale możesz spojrzeć na wyniki tasklist. Wyświetli nazwę i numer sesji każdego uruchomionego procesu. Jeśli jesteś zalogowany lokalnie, spójrz na identyfikator sesji o nazwie „konsola”.

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

Edytuj :

Query Session pobierze identyfikator sesji:

d:\>query session
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           janedoe                   1  Active
 rdp-tcp                                 65536  Listen
Gary
źródło
Chcę go pobrać za pomocą wiersza polecenia.
Negatywne
1
Z linii poleceń wpisz tasklist.
Gary
1
Hmm, możesz być tutaj. edit: tasklist / FI "imagename eq cmd.exe" / FO list Planuję analizować to wyjście. Dzięki!
Negatywne
Albo mogę to zrobić. Nicea
negatywne
tasklistjest dobry, ponieważ nie wymaga wersji Pro / Ent OS. Możesz także wyświetlić listę tylko interaktywnych sesji, filtrując dla 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
źródło
1
Rozwiązanie Oscara faktycznie działało dla mnie, gdy zastąpiono %% G tokenami% G: for / f = 4 delims = "% G w ('tasklist / FI" IMAGENAME eq tasklist.exe "/ NH') do SET RDP_SESSION =% G
Paweł Stankowski
2
@ PawełStankowski: to różnica, jeśli uruchomisz go z pliku wsadowego (%%) lub z konsoli (%)
Thomas Weller
Pamiętaj, że psuje się to w mało prawdopodobnym przypadku, gdy wielu użytkowników działa tasklistjednocześnie.
Matthew Lundberg
5

To łączy aspekty odpowiedzi Gary'ego i odpowiedzi Oscara . Jak zauważył Gary, produkcja query sessionwygląda podobnie

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

lub, w moim przypadku (używając „Przełącz użytkownika”)

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

(Nie mam skonfigurowanego protokołu RDP, więc nie mogę go przetestować.) Prawdopodobnie celem tego pytania jest określenie identyfikatora aktualnie aktywnej sesji. Sugeruję przeszukanie danych wyjściowych query session czegoś, co wygląda jak bieżąca sesja:

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

który przypisuje 2, 3 i 4 słowa (które mamy nadzieję, że nazwa użytkownika [SESJA] ID i stan) z każdej linii wyjścia query sessiondo %a, %bi %c, odpowiednio, a następnie informuje Session ID z linii, gdzie USERNAME to ja, a STATE to Active.

Okazuje się, że query sessionwymaga usernameparametru, więc powyższe można uprościć

 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 (plik wsadowy), możesz 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 %%ai %%b(zamiast %ai %b), ponieważ jest w skrypcie. Prawdopodobnie możesz pominąć, @ jeśli cały plik wsadowy jest poniżej @echo off. Inicjalizacja do unknownpozwala na obsługę błędów (wykrywanie, czy nie ma linii na wyjściu query session tego dopasowania). Rozszerzenie obsługi błędów w celu rozpoznawania i reagowania, jeśli na wyjściu jest wiele pasujących linii, query sessionpozostawia się jako ćwiczenie.

G-Man mówi „Przywróć Monikę”
źródło
W moim przypadku, jeśli istnieje wiele sesji, zawsze będą miały tę samą nazwę użytkownika. Ale to chyba nie jest typowe.
Matthew Lundberg,
@MatthewLundberg: Co powiesz na STATE? Czy sesje inne niż bieżąca są identyfikowane jako „Aktywne”?
G-Man mówi „Reinstate Monica”
Tak, byliby aktywni. Jest to system operacyjny serwera.
Matthew Lundberg,
2

W przeciwieństwie do nazwy sesji, identyfikator sesji nie jest przechowywany w zmiennej i nie jest tak łatwo dostępny. Jestem pewien, że istnieje, ale nie mogę wymyślić wbudowanego narzędzia wiersza poleceń, które to robi.

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

Wyświetli zarówno identyfikator sesji, jak i kod powrotu, dzięki czemu można go używać w różnych skryptach / technikach.

Link do pliku w MediaFire

William Hilsum
źródło
1

Jest to oparte na kodzie Oscara Beh.

tasklistpokaże raport ID sesji (i inne informacje) dla wszystkich instancji danego pliku wykonywalnego, w tym dla niego samego. Gdy uruchomisz polecenie, wyświetli się identyfikator sesji. Jedyną potencjalną wadą jego kodu jest to, że nie informuje cię, jeśli istnieje wiele instancji programu, co może spowodować, że skrypt zwróci nieprawidłowe wyniki.

Tutaj zgłaszamy wszystkie przypadki, tasklistaby upewnić się, że nie ma innej sesji z tym poleceniem:

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

Jeśli zobaczysz zgłoszenie dwóch identyfikatorów sesji, uruchom skrypt ponownie.

Matthew Lundberg
źródło