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

Hoe kan ik de Session ID ophalen vanaf de commandoregel?

Hoe kan ik de huidige sessie-ID van een gebruiker opvragen via de opdrachtregel van Windows?

In de tasklist onder het tabblad gebruikers, is elke gebruiker gekoppeld aan een sessie ID. Ik wil deze opvragen via de opdrachtregel, zodat ik deze kan gebruiken voor een toepassing op afstand.

Antwoorden (5)

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

Dit is zeker niet de meest efficiënte manier, maar je kan eens kijken naar de resultaten van tasklist. Het zal de naam en het sessie# van elk draaiend proces tonen. Als je lokaal bent ingelogd, kijk dan naar het ID voor de sessie met de naam “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 zal de sessie id ophalen:

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

Dit combineert aspecten van Gary’s antwoord en Oscar’s antwoord .  Zoals opgemerkt door Gary, ziet de uitvoer van query session er ongeveer zo uit als

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

of, in mijn geval (met behulp van “Switch user”)

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

(Ik heb RDP niet ingesteld, dus ik kan er niet mee testen. )  Vermoedelijk is de bedoeling van de vraag om de ID van de huidige actieve sessie te bepalen.   Ik stel voor om in de uitvoer van query session te zoeken naar wat lijkt op de huidige sessie:

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

die het 2e, 3e en 4e woord (waarvan we hopen dat het de USERNAME, [SESSION] ID, en STATE zijn) van elke regel van de uitvoer van query session toewijst aan respectievelijk %a, %b, en%c, en dan SESSION ID rapporteert van de regel waar USERNAME me is en STATE Active is.

Het blijkt dat query session een username parameter neemt, dus het bovenstaande kan vereenvoudigd worden tot

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

of

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

Om dit in een script (batch file) te gebruiken, zou je misschien willen zeggen

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

met behulp van %%a en %%b (in plaats van %a en %b) omdat het in een script staat.   Je kunt de @ waarschijnlijk weglaten als het hele batch-bestand onder @echo off staat. De initialisatie naar unknown laat je foutafhandeling doen (detecteren of er geen regel is in de uitvoer van query session die overeenkomt).  Het uitbreiden van de foutafhandeling om te herkennen en te reageren als er meerdere overeenkomende regels zijn in de uitvoer van query session wordt als een oefening overgelaten.

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

In tegenstelling tot de Session Name, is de Session ID niet opgeslagen in een variabele en is niet zo gemakkelijk te bereiken. Ik weet zeker dat er een is, maar ik kan geen ingebouwde commandoregel-tool bedenken die dit doet.

Ik heb echter een piepklein .exe bestandje geschreven (C#, .Net 4) dat dit doet.

Het zal zowel de sessie id weergeven, en ook het hebben als de return code, zodat je dit kunt gebruiken in een verscheidenheid van scripts/technieken. Link naar bestand op MediaFire

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

Dit is gebaseerd op de code van Oscar Beh.

tasklist laat de sessie ID (en andere informatie) zien voor alle instanties van een gegeven executable, inclusief zichzelf. Terwijl je het commando uitvoert, zal het je sessie-id laten zien. Het enige potentiële defect in deze code is dat het je niet informeert of er meerdere instanties van het programma zijn, waardoor het script onjuiste resultaten kan geven.

Hier rapporteren we alle instanties van tasklist om er zeker van te zijn dat er niet nog een sessie is die dat commando uitvoert:

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

Als je twee Session ID’s gerapporteerd ziet, voer het script dan opnieuw uit.