Kann ich die Sitzungs-ID eines Benutzers finden, der an einem anderen Computer angemeldet ist?

33477
Dan Tao

Ich möchte eine Anwendung auf einem anderen Computer im selben Netzwerk über die Befehlszeile öffnen. Das Szenario hier ist, dass sich der Benutzer in einem Raum befindet, der von etwa 20 Computern umgeben ist und die gleiche App auf jedem Computer starten möchte, ohne dass er von Bildschirm zu Bildschirm wechselt, um sie auf jedem einzelnen Computer zu öffnen. Ich habe entdeckt, dass ich die grundlegende Funktionalität dafür mit PsExec wie folgt erhalten kann:

psexec \\[computer] -u [username] -p [password] -d -i [SessionID] [program] 

Für computer, username, password, und program, sie ist gut. Weiß jemand, wie ich herausfinden kann, welcher SessionIDBenutzer einem bestimmten Benutzer zugewiesen ist, der an einem bestimmten Computer im Netzwerk angemeldet ist? Gibt es alternativ einen besseren Weg, um das zu erreichen, was ich zu erreichen versuche?

7

6 Antworten auf die Frage

4
grawity

Mit dem qwinsta(oder query session) Tool können Sie alle Terminalserversitzungen auflisten.

Einige Server erlauben die direkte Verwendung des Servers:

qwinsta / server entfernt 

In den meisten Fällen müssen Sie es jedoch durch psexec laufen lassen :

psexec \\ remotehost qwinsta 
3
Andrew Wiggin

psexec benötigt keine Session-ID.

Es erfordert * keine * Sitzungs-ID in dem Sinne, dass die Standardeinstellung einfach 0 ist. Diese Standardeinstellung ist jedoch nutzlos, wenn mehrere Benutzer angemeldet sind und Sie einen bestimmten Benutzer auswählen möchten. grawity vor 11 Jahren 2
3
Wernight

Sie können die PowerShell- Version ausprobieren :

Get-Process powershell | Select-Object SessionId | Format-List 

oder die MSDOS-Batch- Version:

tasklist /FI "IMAGENAME eq tasklist.exe" /FI "USERNAME eq %USERNAME%" /FO LIST | find "Session#:" 
1
heavyd

Mit Process Explorer auf dem Computer können Sie die Sitzungs-ID mithilfe des Menüs Benutzer ermitteln. Die Nummer am Anfang jedes Eintrags im Menü ist die Sitzungs-ID.

Normalerweise sollten Sie in der Lage sein, 0 für die Standardsitzung zu verwenden.

Sieht ziemlich nützlich aus; Ich suche jedoch nach der Sitzungs-ID, die einem Benutzer auf einem * anderen * Computer zugewiesen wurde. Es scheint, dass Process Explorer nur für die Maschine gilt, auf der er ausgeführt wird. Ist das richtig? Dan Tao vor 14 Jahren 1
Yes that is true. I haven't found a way to do this remotely. heavyd vor 14 Jahren 0
0
Fabien Teulieres

Die Verwendung der richtigen Sitzungs-ID kann in der Tat erforderlich sein, um einen Job auf einem Remote-Computer ordnungsgemäß zu starten, auf den mehrere verschiedene Benutzer zugreifen.

Hier ist, was ich nach der Bastelei mit einer Kombination aus gefunden Batch - Befehlen und psexec . Ich habe alles in einer * .bat-Datei gerollt und dabei 4 Parameter genommen : (P1) Benutzername, (P2) Servername, (P3) Login, (P4) Passwort.

Nach der Ausführung (und falls erfolgreich) werden die Sitzungsinformationen einfach in 4 Variablen gespeichert : (V1) Sitzungsname, (V2) Sitzungsbenutzer, (V3) Sitzungs-ID, (V4) Sitzungszustand.

Der Stapel ist für den Fernzugriff auf Informationen konzipiert, kann jedoch leicht an die lokale Verwendung angepasst werden .

@echo off   REM This program gets remote session info on a given server, for a given user. REM It needs 4 parameters: UserName, ServerName, Login, Password  REM For a local session, simply replace the 'psexec \\...' command parsed by the 'for' REM loop with: 'query session ^| find /i "%UserName%"' REM In that case, only the UserName parameter is necessary to call this batch.  set UserName=%1 set ServerName=%2 set Login=%3 set Password=%4  set SessionName= set SessionUser= set SessionId= set SessionState=  for /f "tokens=1,2,3,4 delims=^> " %%a in ('psexec \\%ServerName% -u %Login% -p %Password% query session ^| find /i "%UserName%"') do (  REM Test iterator because a disconnected session may no longer have a name!  if /I "%%b"=="%UserName%" ( set SessionName=%%a set SessionUser=%%b set SessionId=%%c set SessionState=%%d )  if /I "%%a"=="%UserName%" ( set SessionName=[unknown] set SessionUser=%%a set SessionId=%%b set SessionState=%%c ) )  echo Session info: echo - Name: %SessionName% echo - User: %SessionUser% echo - ID: %SessionId% echo - State: %SessionState% 

ANMERKUNGEN:

  • Die Trennzeichen der Schleife sind '>' und 'Leerzeichen'. Dies liegt daran, dass die Befehlsausgabe 'Abfrage Sitzung' ein '>' enthält, um die aktive Sitzung auf dem Zielcomputer anzuzeigen. Ich musste einen Weg für die Schleife finden, um dieses störende Zeichen zu ignorieren, da es normalerweise als Umleitung in eine Datei interpretiert wird.
  • Ich ignorierte freiwillig den Sitzungstyp und Geräteausgänge. Ich glaube, sie könnten schließlich mit %% e und %% f hinzugefügt werden, um bei Bedarf 2 weitere Variablen in die Schleife einzugeben.
  • Wie im Stapelkommentar erläutert, sollten Sie zur Verwendung des Stapels auf dem lokalen Computer nicht den Aufruf 'psexec \\ ...' verwenden, sondern: 'query session ^ | find / i "% UserName%" ' stattdessen. In diesem Fall wird nur der Parameter P1 benötigt.
0
noam

Overkill für diese Frage, aber nur für den Fall, dass dies nützlich ist

FUNCTION Get-UserNameSessionIDMap ($Comp) { $quserRes = quser /server:$comp | select -skip 1 if (!$quserRes) { RETURN } $quCSV = @() $quCSVhead = "SessionID","UserName","LogonTime" foreach ($qur in $quserRes)  { $qurMap = $qur.Trim().Split(" ") | ? {$_} if ($qur -notmatch " Disc ") { $quCSV += $qurMap[2] + "|" + $qurMap[0] + "|" + $qurMap[5] + " " + $qurMap[6] } else { $quCSV += $qurMap[1] + "|" + $qurMap[0] + "|" + $qurMap[4] + " " + $qurMap[5] } #disconnected sessions have no SESSIONNAME, others have ica-tcp#x } $quCSV | ConvertFrom-CSV -Delimiter "|" -Header $quCSVhead } #end function Get-UserNameSessionIDMap