Scripting - Wie trenne ich Remotedesktopsitzungen?

8

Ich suche nach einer Möglichkeit, alle aktiven Remotedesktopsitzungen auf einem Computer (lokaler Computer) zu schließen. Windows enthält einige Befehle (rwinsta, qwinsta usw.) zum Anzeigen der aktiven Sitzungen, aber ich sehe nicht, wie ich die Informationen einfach verwenden kann (es sei denn, ich analysiere die Zeichenfolge ...), um alle Sitzungen zu schließen.

Gibt es in Powershell (oder C #, Batch) eine Möglichkeit, alle Remotedesktopsitzungen auf einem lokalen Computer zu schließen?

Danke, Martin

Martin
quelle
Ich habe meine Antwort aktualisiert, um eine Schleife einzuschließen, die nur aktive Remote-Sitzungen trennt, nicht die Konsole
Kevin Kuphal

Antworten:

5

Sie können versuchen, den undokumentierten /smParameter für query session(in einer Batchdatei) zu verwenden, um die Dinge einfacher zu sortieren:

FOR /f %%G IN ('query session /sm') DO tsdiscon %%G
Adam Brand
quelle
Das ist ein guter Anfang ... aber ich möchte nur Remotedesktopsitzungen trennen.
Martin
4

Ja, mit tsdiscon über eine Befehlszeile:

tsdiscon n

Dabei sollte das n durch die Sitzungs-ID ersetzt werden.

Sie können die Sitzungsnummer von erhalten

query session

Da Sie sagen, dass Sie alle Sitzungen auf dem lokalen Computer schließen möchten, müssen Sie in der Reihenfolge, in der Sie dies tun, vorsichtig sein (dh Ihre Sitzung zuletzt schließen).

Rob Levine
quelle
2

Vielleicht möchten Sie sich Powershell Community Extensions ansehen. Es enthält Cmdlets zum Abrufen, Stoppen und Trennen von TerminalSession.

Chad Miller
quelle
2

Mit dem Dienstprogramm tsdiscon können Sie Sitzungen trennen. Wenn Sie den Befehl "Abfragesitzungen" an einer Eingabeaufforderung verwenden, können Sie die Liste der IDs anzeigen und dann für jede ID einen Befehl disdiscon ausgeben.

Ein solches Schleifenkonstrukt sollte funktionieren

FOR /f %%G IN ('q.bat') DO tsdiscon %%G

wo q.bat ist

query session /sm | find "Active"

Dadurch werden nur Remotesitzungen getrennt und der Konsolenbenutzer ignoriert.

Kevin Kuphal
quelle
1

Sie können lokale oder Remote-Sitzungen mit tsdiscon trennen.

Disconnects a terminal session.

TSDISCON [sessionid | sessionname] [/SERVER:servername] [/V]

  sessionid           The ID of the session.
  sessionname         The name of the session.
  /SERVER:servername  Specifies the Terminal server (default is current).
  /V                  Displays information about the actions performed.
JasonMArcher
quelle
1

Ich habe festgestellt, dass TSDISCON "Disc" -verbundene Sitzungen nicht entfernt.

Ich habe TSDISCON durch Abmelden ersetzt.


quelle
1

Ich weiß, dass das OP jetzt ziemlich alt ist, aber dies sollte das tun, wonach Sie suchen (und falls noch jemand nach etwas sucht, um dasselbe zu tun, dachte ich, ich würde trotzdem antworten).

Ebenso könnten Sie query/reset sessionanstelle von q/rwinsta...

FOR /F %%A IN (computers.txt) DO (
    FOR /f "tokens=2" %%i IN ('qwinsta /SERVER:%%A ^| find /i "disc"') DO ECHO %%i | rwinsta %%i /SERVER:%%A /V
)
Carly
quelle
1

FOR /F %A IN (c:\scripts\ps\computers.txt) DO (FOR /f "tokens=2" %i IN ('qwinsta /SERVER:%A ^| find /i "disc"') **DO if "%i" NEQ "0" ECHO %i** | rwinsta %i /SERVER:%A /V)

greg
quelle
0

Mit dem Befehl TSDiscon werden RDP-Sitzungen (Terminal Services) getrennt. Bei alleiniger Verwendung wird die Verbindung zur aktuellen Sitzung getrennt. Sie können die Sitzungs-ID der Sitzung angeben, von der Sie die Verbindung trennen möchten. Sie können auch den Servernamen angeben, von dem die Verbindung getrennt werden soll.

Ausführliche Informationen finden Sie hier .

Sam Cogan
quelle
0

Sie haben nicht angegeben, ob Sie dies tun möchten, ohne den Computer herunterzufahren oder neu zu starten. Aber wenn Ihnen ein Neustart oder Herunterfahren nichts ausmacht, können Sie einfach anrufen:

shutdown -r -f -m \\computer_to_restart

Dies erzwingt tatsächlich einen Neustart des Computers.

Nick Berardi
quelle
Nun ... das ist eine Idee. Aber ich möchte nicht alle Sitzungen beenden. Nur die Remotedesktopsitzungen.
Martin
0

Auch wenn die Frage sehr alt ist, gibt es kaum Lösungen für alle Versionen ohne qwinsta / query / tsdiscon, nämlich für alle Windows-Heimversionen.

Es gibt jedoch eine einfache Powershell-Version, um eine Sitzung zu trennen:

$code = @'
[DllImport("wtsapi32.dll")]
static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);

[DllImport("wtsapi32.dll")]
static extern void WTSCloseServer(IntPtr hServer);

[DllImport("Wtsapi32.dll")]
static extern bool WTSDisconnectSession(System.IntPtr hServer, int SessionId, bool bWait);

public static void DisconnectSession (String ServerName, int SessionId)
{
    IntPtr serverHandle = WTSOpenServer(ServerName);
    WTSDisconnectSession(serverHandle, SessionId, true);
    WTSCloseServer(serverHandle);
}
'@

$tstType=Add-Type -name Test -MemberDefinition $code -PassThru
#$tstType::DisconnectSession("localhost", 2)

Eine Sitzungs-ID kann zB mit erhalten werden getProcesss. Um eine Sitzung zu trennen (nicht abzumelden!), Verwenden Sie $tstType::DisconnectSession("localhost", 2).

GMA
quelle