Kann ich die Sitzungs-ID für einen Benutzer finden, der an einem anderen Computer angemeldet ist?

7

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 ungefähr 20 Computern umgeben ist, und in der Lage sein möchte, dieselbe App auf jedem Computer zu starten, ohne von Bildschirm zu Bildschirm zu gehen und sie auf jedem einzelnen Computer zu öffnen. Ich habe festgestellt, dass ich mit PsExec die grundlegenden Funktionen dafür wie folgt erhalten kann:

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

Für computer, username, password, und program, sie ist gut. Kennt jemand eine Möglichkeit, herauszufinden, welche SessionIDeinem 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 erreichen möchte?

Dan Tao
quelle

Antworten:

4

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

Einige Server erlauben die direkte Verwendung per Fernzugriff:

qwinsta / server remotehost

In den meisten Fällen müssen Sie es jedoch über psexec ausführen :

psexec \\ remotehost qwinsta
user1686
quelle
3

Für psexec ist keine Sitzungs-ID erforderlich.

Andrew Wiggin
quelle
2
Es ist keine Sitzungs-ID in dem Sinne erforderlich, dass sie standardmäßig 0 ist. Diese Standardeinstellung ist jedoch nutzlos, wenn mehrere Benutzer angemeldet sind und Sie einen bestimmten auswählen möchten.
user1686
3

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#:"
Wernight
quelle
1

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

Es sieht so aus, als ob Sie normalerweise 0 für die Standardsitzung verwenden können sollten.

schwer
quelle
1
Sieht ziemlich nützlich aus; Ich suche jedoch nach der Sitzungs-ID, die einem Benutzer auf einem anderen Computer zugewiesen wurde . Es sieht so aus, als ob der Prozess-Explorer nur auf den Computer anwendbar ist, auf dem er ausgeführt wird. Ist das richtig?
Dan Tao
Ja, das ist wahr. Ich habe keinen Weg gefunden, dies aus der Ferne zu tun.
schwer
0

Die Verwendung der richtigen Sitzungs-ID kann in der Tat erforderlich sein, um einen Job auf einem Remotecomputer, auf den mehrere unterschiedliche Benutzer zugreifen, angemessen zu starten.

Folgendes habe ich gefunden, nachdem ich an einer Kombination aus Batch-Befehlen und psexec herumgebastelt habe . Ich habe alles in einer * .bat-Datei mit 4 Parametern zusammengefasst : (P1) Benutzername, (P2) Servername, (P3) Login, (P4) Passwort.

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

Der Stapel ist für den Fernzugriff auf Informationen konzipiert, kann jedoch problemlos 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 Schleifenbegrenzer sind '>' und 'Leerzeichen'. Dies liegt daran, dass die Befehlsausgabe 'Abfragesitzung' ein '>' enthält, um die aktive Sitzung auf dem Zielcomputer anzugeben. Ich musste einen Weg finden, wie die Schleife dieses störende Zeichen ignorieren konnte, da es normalerweise als Umleitung in eine Datei interpretiert wird.
  • Ich freiwillig die Sitzung ignoriert Art und Geräteausgänge. Ich glaube, sie könnten eventuell mit %% e und %% f hinzugefügt werden, um bei Bedarf zwei weitere Variablen in die Schleife einzuspeisen.
  • Wie im Stapelkommentar erläutert, sollten Sie zur Verwendung des Stapels auf dem lokalen Computer nicht den Aufruf 'psexec \\ ...' verwenden, sondern: 'Abfragesitzung ^ | finde stattdessen / i "% UserName%" ' . In diesem Fall wird nur der Parameter P1 benötigt.
Fabien Teulieres
quelle
0

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
noam
quelle