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

Wie kann ich die Session-ID über die Kommandozeile abrufen?

Wie kann ich die aktuelle Benutzer-Sitzungs-ID über die Windows-Befehlszeile abrufen?

In der Taskliste unter der Registerkarte “Benutzer” ist jeder Benutzer mit einer Sitzungs-ID verbunden. Ich möchte diese über die Befehlszeile abrufen, damit ich sie für eine Remote-Anwendung verwenden kann.

Antworten (5)

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

Dies ist sicherlich nicht der effizienteste Weg, aber Sie können sich die Ergebnisse von tasklist ansehen. Es wird der Name und die Sitzungsnummer jedes laufenden Prozesses angezeigt. Wenn Sie lokal angemeldet sind, sehen Sie sich die ID für die Sitzung mit dem Namen “console” an.

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 ermittelt die Sitzungs-ID:

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

Dies kombiniert Aspekte von Garys Antwort und Oscars Antwort .  Wie von Gary angemerkt, sieht die Ausgabe von query session in etwa so aus wie

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

oder, in meinem Fall (unter Verwendung von “Benutzer wechseln”)

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

(Ich habe kein RDP eingerichtet, daher kann ich nicht damit testen. )  Vermutlich ist die Absicht der Frage, die ID der gerade aktiven Sitzung zu ermitteln.   Ich schlage vor, die Ausgabe von query session nach etwas zu durchsuchen, das wie die aktuelle Sitzung aussieht:

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

, was das zweite, dritte und vierte Wort (von dem wir hoffen, dass es der USERNAME, die [SESSION]-ID und STATE ist) aus jeder Zeile der Ausgabe von query session zu %a, %b bzw.%c zuweist und dann die SESSION-ID aus der Zeile meldet, in der USERNAME ich und STATE Active ist.

Es stellt sich heraus, dass query session einen username-Parameter annimmt, also kann das obige zu

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

oder

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

vereinfacht werden. Um dies in einem Skript (Stapeldatei) zu verwenden, möchten Sie vielleicht

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

sagen, indem Sie %%a und %%b (statt %a und %b) verwenden, weil es in einem Skript ist.   Sie können wahrscheinlich die @ weglassen, wenn die gesamte Batch-Datei unter @echo off liegt. Die Initialisierung auf unknown ermöglicht eine Fehlerbehandlung (Erkennung, wenn es in der Ausgabe von query session keine Zeile gibt, die übereinstimmt).  Das Erweitern der Fehlerbehandlung, um zu erkennen und zu reagieren, wenn es mehrere übereinstimmende Zeilen in der Ausgabe von query session gibt, wird als Übung belassen.

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

Anders als der Sitzungsname wird die Sitzungs-ID nicht in einer Variablen gespeichert und ist nicht so einfach zu erreichen. Ich bin sicher, dass es eines gibt, aber mir fällt kein eingebautes Kommandozeilen-Tool ein, das dies tut.

Ich habe jedoch eine kleine .exe-Datei (C#, .Net 4) geschrieben, die dies tut.

Sie zeigt sowohl die Sitzungs-ID an, als auch den Rückgabewert, so dass Sie diese in einer Vielzahl von Skripten/Techniken verwenden können. Link zur Datei auf MediaFire

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

Dies basiert auf dem Code von Oscar Beh.

tasklist zeigt die Sitzungs-ID (und andere Informationen) für alle Instanzen einer bestimmten ausführbaren Datei an, einschließlich sich selbst. Während Sie den Befehl ausführen, zeigt er Ihre Sitzungs-ID an. Der einzige potenzielle Fehler in seinem Code ist, dass er Sie nicht informiert, wenn es mehrere Instanzen des Programms gibt, was dazu führen kann, dass das Skript falsche Ergebnisse liefert.

Hier melden wir alle Instanzen von tasklist, um sicherzustellen, dass keine andere Sitzung diesen Befehl ausführt:

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

Wenn Sie zwei Sitzungs-IDs gemeldet sehen, führen Sie das Skript erneut aus.