Wie kann ich die Sitzungs-ID von der Befehlszeile abrufen?

26

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

In der Jobliste unter der Registerkarte Benutzer ist jedem Benutzer eine Sitzungs-ID zugeordnet. Ich möchte dies über die Befehlszeile abrufen, damit ich es für eine Remoteanwendung verwenden kann.

Negativ
quelle
Ich bin mir nicht sicher, was Sie unter Sitzungs-ID verstehen.
EBGreen
In der Jobliste unter der Registerkarte Benutzer ist jedem Benutzer eine Sitzungs-ID zugeordnet. Ich möchte dies über die Befehlszeile abrufen, damit ich es für eine Remoteanwendung verwenden kann.
Negative
siehe auch superuser.com/questions/123242/...
matt wilkie
%% G wäre, wenn Sie es aus einem Stapel aufrufen,% G, wenn Sie es direkt von der Befehlszeile aus

Antworten:

28

Dies ist sicherlich nicht der effizienteste Weg, aber Sie können sich die Ergebnisse von anschauen tasklist. Es zeigt den Namen und die Sitzungsnummer jedes ausgeführten Prozesses an. Wenn Sie lokal angemeldet sind, überprüfen Sie die ID der Sitzung mit dem Namen "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

Bearbeiten :

Query Session ruft die Sitzungs-ID ab:

d:\>query session
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           janedoe                   1  Active
 rdp-tcp                                 65536  Listen
Gary
quelle
Ich suche es über die Befehlszeile abzurufen.
Negative
1
Rechts, in der Befehlszeile, tippe tasklist ein.
Gary,
1
Hmm, vielleicht bist du ja hier dran. edit: tasklist / FI "imagename eq cmd.exe" / FO liste Ich plane, diese Ausgabe zu analysieren. Vielen Dank!
Negative
Oder ich kann das machen. Nizza
Negativ
tasklistist gut, weil es keine Pro / Ent OS-Version erfordert. Sie können auch nur interaktive Sitzungen tasklist /fi "imagename eq explorer.exe"
auflisten,
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
quelle
1
Oskars Lösung funktionierte tatsächlich für mich, als %% G durch% G ersetzt wurde: für / f "tokens = 4 delims ="% G in ("Jobliste / FI" IMAGENAME eq tasklist.exe "/ NH") setze RDP_SESSION =% G
Paweł Stankowski
2
@ PawełStankowski: das ist der Unterschied, wenn Sie es von einer Batch-Datei (%%) oder von der Konsole (%) ausführen
Thomas Weller
Beachten Sie, dass dies das unwahrscheinliche Ereignis unterbricht, dass mehrere Benutzer tasklistgleichzeitig ausgeführt werden.
Matthew Lundberg
5

Dies kombiniert Aspekte von Gary Antwort und Oscar Antwort . Wie Gary bemerkte, query sessionsieht die Ausgabe von ungefähr so ​​aus

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

oder, in meinem Fall (mit "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 es nicht testen.) Vermutlich besteht die Absicht der Frage darin, die ID der derzeit aktiven Sitzung zu ermitteln. Ich schlage vor, die Ausgabe von query session nach der aktuellen Sitzung zu durchsuchen :

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

auf deren Grundlage das 2., 3. und 4. Wort (was wir hoffen , dass die NUTZERNAME zu sein, [SESSION] ID und STATE) aus jeder Zeile der Ausgabe von query sessionauf %a, %bund %cist, und dann meldet Sitzungs - ID aus der Zeile , in der USERNAME bin ich und STATE ist Active.

Es stellt sich heraus, dass query sessionein usernameParameter benötigt wird, sodass das oben Gesagte vereinfacht werden kann

 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

Um dies in einem Skript (Batch-Datei) zu verwenden, möchten Sie vielleicht sagen

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

Verwenden von %%aund %%b(anstelle von %aund %b), weil es in einem Skript enthalten ist. Sie können das wahrscheinlich weglassen, @ wenn sich die gesamte Batch-Datei darunter befindet @echo off. Die Initialisierung, unknownmit der Sie die Fehlerbehandlung durchführen können (Ermitteln, ob in der Ausgabe query session dieser Übereinstimmungen keine Zeile vorhanden ist ). Die Erweiterung der Fehlerbehandlung, um zu erkennen und zu reagieren, ob die Ausgabe von mehrere übereinstimmende Zeilen enthält, query session bleibt als Übung übrig.

G-Man sagt, "Monica wiedereinsetzen"
quelle
In meinem realen Fall haben mehrere Sitzungen immer den gleichen Benutzernamen. Aber das ist wahrscheinlich nicht typisch.
Matthew Lundberg
@MatthewLundberg: Wie wäre es mit STATE? Sind andere als die aktuellen Sitzungen als "Aktiv" gekennzeichnet?
G-Man sagt, dass Monica
Ja, sie wären aktiv. Es ist ein Server-Betriebssystem.
Matthew Lundberg
2

Im Gegensatz zum Sitzungsnamen wird die Sitzungs-ID nicht in einer Variablen gespeichert und ist nicht so einfach zu erreichen. Ich bin mir sicher, dass es eines gibt, aber ich kann mir kein eingebautes Kommandozeilen-Tool vorstellen, das dies tut.

Ich habe jedoch eine winzige EXE-Datei (C #, .Net 4) geschrieben, die dies ausführt.

Es wird sowohl die Sitzungs-ID als auch den Rückkehrcode anzeigen, sodass Sie diese in einer Vielzahl von Skripten / Techniken verwenden können.

Link zur Datei auf MediaFire

William Hilsum
quelle
1

Dies basiert auf dem Code von Oscar Beh.

tasklistZeigt die Sitzungs-ID (und andere Informationen) für alle Instanzen einer bestimmten ausführbaren Datei an, einschließlich der eigenen. Während Sie den Befehl ausführen, wird Ihre Sitzungs-ID angezeigt. Der einzige mögliche Fehler in seinem Code besteht darin, dass er Sie nicht darüber informiert, ob mehrere Instanzen des Programms vorhanden sind, was dazu führen kann, dass das Skript falsche Ergebnisse zurückgibt.

Hier werden alle Instanzen von gemeldet, tasklistum sicherzustellen, dass dieser Befehl nicht in einer anderen Sitzung ausgeführt wird:

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

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

Matthew Lundberg
quelle