RDS Server 2012 R2 - Alle Remote-Benutzer außer Administrator abmelden
Hallo,
folgendes Szenario:
Ein virtualisierter Remotedesktopdienste-Server 2012 R2 steht zehn Nutzern zur Verfügung. Der Administrator ist stets lokal eingeloggt (gesperrt), da er eine Anwendung laufen haben muss, die zu einer bestimmten Uhrzeit Daten an extern versendet. Die zehn Nutzer melden sich, wie es viele tun, die RD-Dienste via ThinClient nutzen, selten ab sondern trennen nur die Sitzungen (Gerät ausschalten).
Vor kurzem habe ich selbst jemand anderem den Tipp zu genau demselben Problem mit folgendem Skript gegeben ohen es selbst testen zu können:
@echo off
query session >session.txt
for /f "eol=> skip=2 tokens=1,2,3," %%i in (session.txt) DO (
if "%%k" == "Getr." (
REM Getrennte Verbindungen killen
echo %%i %%j
logoff %%j
) else (
REM Aktive Verbindungen killen
echo %%j %%k
logoff %%k
)
)
del session.txt
pause
Quelle: www.denniskoerner.de/blog/2011/01/25/auf-windows-terminalserver-alle-benutzer-abmelden/
Dieses Skript habe ich als .bat-Datei mit einem Task verbunden, der Abends startet. Ausführender des Tasks ist der Administrator mit höchsten Privilegien.
Nun hatte dieser Jemand, einer in den Kommentaren des Links und nun auch ich das Problem, dass das unter Server 2012 (R2) nur teilweise funktioniert. Es werden alle Sitzungen abgemeldet, getrennte wie auch aktive; einschließlich des Administrators. Im Link wird erklärt, dass das "eol=>" dafür sorgt, dass der Logoff nicht für den gilt, der das Skript startet. Das klappt aber nicht; der Administrator wird auch abgemeldet und das soll er nicht.
Frage:
Wie müsste ich die Batch umschreiben, dass die Sitzungs-ID des Administrators aus der session.txt separat gelesen wird und in einem "elsif" (gibts das bei Batch? ) in ein Überspringen endet oder allgemein übersprungen wird? Ich kenne mich mit Batch-Programmierung nicht gut aus.
Alternativ: Gibt es eine einfache Powershell-Lösung zum abmelden von Remotesitzungen?
Die Anwendung als Dienst umpacken ist Lösung, die ich leider ausschließen muss.
Grüße Winary
folgendes Szenario:
Ein virtualisierter Remotedesktopdienste-Server 2012 R2 steht zehn Nutzern zur Verfügung. Der Administrator ist stets lokal eingeloggt (gesperrt), da er eine Anwendung laufen haben muss, die zu einer bestimmten Uhrzeit Daten an extern versendet. Die zehn Nutzer melden sich, wie es viele tun, die RD-Dienste via ThinClient nutzen, selten ab sondern trennen nur die Sitzungen (Gerät ausschalten).
Vor kurzem habe ich selbst jemand anderem den Tipp zu genau demselben Problem mit folgendem Skript gegeben ohen es selbst testen zu können:
@echo off
query session >session.txt
for /f "eol=> skip=2 tokens=1,2,3," %%i in (session.txt) DO (
if "%%k" == "Getr." (
REM Getrennte Verbindungen killen
echo %%i %%j
logoff %%j
) else (
REM Aktive Verbindungen killen
echo %%j %%k
logoff %%k
)
)
del session.txt
pause
Quelle: www.denniskoerner.de/blog/2011/01/25/auf-windows-terminalserver-alle-benutzer-abmelden/
Dieses Skript habe ich als .bat-Datei mit einem Task verbunden, der Abends startet. Ausführender des Tasks ist der Administrator mit höchsten Privilegien.
Nun hatte dieser Jemand, einer in den Kommentaren des Links und nun auch ich das Problem, dass das unter Server 2012 (R2) nur teilweise funktioniert. Es werden alle Sitzungen abgemeldet, getrennte wie auch aktive; einschließlich des Administrators. Im Link wird erklärt, dass das "eol=>" dafür sorgt, dass der Logoff nicht für den gilt, der das Skript startet. Das klappt aber nicht; der Administrator wird auch abgemeldet und das soll er nicht.
Frage:
Wie müsste ich die Batch umschreiben, dass die Sitzungs-ID des Administrators aus der session.txt separat gelesen wird und in einem "elsif" (gibts das bei Batch? ) in ein Überspringen endet oder allgemein übersprungen wird? Ich kenne mich mit Batch-Programmierung nicht gut aus.
Alternativ: Gibt es eine einfache Powershell-Lösung zum abmelden von Remotesitzungen?
Die Anwendung als Dienst umpacken ist Lösung, die ich leider ausschließen muss.
Grüße Winary
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 294617
Url: https://administrator.de/contentid/294617
Ausgedruckt am: 25.11.2024 um 06:11 Uhr
14 Kommentare
Neuester Kommentar
Moin,
warum trennst Du die User nicht zwangsweise per GPO, nachdem sie die Sitzung getrennt haben?
Unter Benutzerkonfiguration -> Administrative Vorlagen -> Windowskomponenten -> Zeitlimit für getrennte Situngen festlegen
Da setzt Du einen Zeitwert, nachdem das System die Sitzung beendet, selbst, wenn der User das nicht getan hat.
Gruß
Looser
warum trennst Du die User nicht zwangsweise per GPO, nachdem sie die Sitzung getrennt haben?
Unter Benutzerkonfiguration -> Administrative Vorlagen -> Windowskomponenten -> Zeitlimit für getrennte Situngen festlegen
Da setzt Du einen Zeitwert, nachdem das System die Sitzung beendet, selbst, wenn der User das nicht getan hat.
Gruß
Looser
Naja einfach mal ins Skript ein bisschen reinschauen und das essentielle extrahieren sollte doch reichen...
Ungetestet:
(Username des Administrators und des Servers natürlich anpassen, ob Username mit Domäne oder ohne musst du testen, habe gerade kein RDS hier)
fk
VMWare , Silicon Valley
Ungetestet:
Import-Module Remotedesktop
$connectionbroker = "RDSCONNECTIONBROKER"
(Get-RDSessionCollection -ConnectionBroker $connectionbroker).CollectionName | %{
Get-RDUserSession -CollectionName $_ -ConnectionBroker $connectionbroker | ?{$_.UserName -ne "Administrator"} | %{Invoke-RDUserLogoff -Force -HostServer $_.HostServer.ToString() -UnifiedSessionID $_.UnifiedSessionId.ToString()}
}
fk
VMWare , Silicon Valley
Korrekt.
Muss ich nicht noch den Name der Sammlung irgendwo angeben?
Nein, es werden alle Sammlungen mit einer Schleife durchlaufenOder wird diese Variable durch den Get-RDSessionCollection Befehl gesetzt?
Wird durch die Schleife über alle Collections geholt.Leider kann ich gerade keinen angemeldeten User abmelden. Würde das so funktionieren?
Ja geht einwandfrei, habe es hier gerade noch erfolgreich getestet.