winary
Goto Top

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? face-smile) 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

Content-ID: 294617

Url: https://administrator.de/contentid/294617

Ausgedruckt am: 25.11.2024 um 06:11 Uhr

126919
126919 29.01.2016 um 15:57:28 Uhr
Goto Top
Looser27
Looser27 29.01.2016 um 15:57:42 Uhr
Goto Top
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
Winary
Winary 29.01.2016 um 16:20:52 Uhr
Goto Top
Na super, an das Skriptcenter habe ich gar nicht mehr gedacht. face-big-smile
Das Skript gilt aber nur für getrennte Nutzer, manchmal habe ich aber auch Nutzer, die das Gerät an lassen, weil sie dachten sie kommen vor Feierabend nochmal wieder, dem dann aber nicht so war. Das müsste ich dann mit der GPO verbinden "Zeitlimit für aktive, aber im Leerlauf befindliche Remotedesktopdienste-Sitzungen festlegen".

Das macht es aber etwas zu sehr bedingungsbehaftet, da ich im Endeffekt zu einer bestimmten Uhrzeit nur alle Sitzungen abgemeldet haben will außer dem Administrator. Ist also jemand noch spät aktiv und das Skript läuft durch, erfüllt aber die Bedingung der DisconnectTime nicht, wird er nicht abgemeldet. Der Wert für DisconnectTime muss man in Stunden angeben und das ist zu groß.

Vielleicht habe ich aber auch nur einen Denkfehler.

Danke für die Antwort.
Winary
Winary 29.01.2016 aktualisiert um 16:27:30 Uhr
Goto Top
Zitat von @Looser27:
warum trennst Du die User nicht zwangsweise per GPO, nachdem sie die Sitzung getrennt haben?

Getrennte User trennen? face-smile

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.

Falsch. "Zeitlimit für getrennte Sitzungen festlegen" meldet getrennte Nutzer nach einem Zeitraum ab. Das was du darunter meinst macht die GPO "Zeitlimit für aktive, aber im Leerlauf befindliche Remotedesktopdienste-Sitzungen festlegen".
Wie gesagt möchte ich alle Nutzer zu einer bestimmten Uhrzeit, nicht nach einem bestimmten Zeitraum, außer dem Administrator abmelden.

Danke für die Antwort.
126919
Lösung 126919 29.01.2016, aktualisiert am 03.02.2016 um 12:42:34 Uhr
Goto Top
Naja einfach mal ins Skript ein bisschen reinschauen und das essentielle extrahieren sollte doch reichen...

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()}  
}
(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
tomolpi
tomolpi 29.01.2016 um 18:46:20 Uhr
Goto Top
Dafür gibts doch ne super Option...

Servermanager, RD-Services, Eigenschaften der Bereitstellung. Dann kannst du festlegen, wann die User abgemeldet werden.
Winary
Winary 02.02.2016 um 09:18:54 Uhr
Goto Top
Sry, ich kam noch nicht zum testen. Hole ich nachher nach. Danke.
Winary
Winary 02.02.2016 um 09:19:56 Uhr
Goto Top
Zitat von @tomolpi:
Servermanager, RD-Services, Eigenschaften der Bereitstellung. Dann kannst du festlegen, wann die User abgemeldet werden.

Dort kann ich leider auch nur Zeiträume und keinen Zeitpunkt festlegen.
tomolpi
tomolpi 02.02.2016 um 09:40:18 Uhr
Goto Top
Ich kann bei uns sagen, dass er nach 20min Leerlauf die Session beenden soll, oder willst du ne Uhrzeit eingeben?
Winary
Winary 02.02.2016 um 10:42:40 Uhr
Goto Top
Zitat von @tomolpi:
Ich kann bei uns sagen, dass er nach 20min Leerlauf die Session beenden soll, oder willst du ne Uhrzeit eingeben?

Ja, ich möchte eine Uhrzeit angeben. Zeitraum geht aus diversen Gründen nicht.
Ich habe auch schon mit sc create versucht die Anwendung als Dienst laufen zu lassen, aber als Dienst macht es nicht das was es soll; inkompatibel.

Ich probiere mal Script von oben aus.
Winary
Winary 02.02.2016 um 14:49:33 Uhr
Goto Top
Ich habe die Änderungen wie folgt vorgenommen:

Import-Module Remotedesktop 
$connectionbroker = "servername.domain.local"   
(Get-RDSessionCollection -ConnectionBroker $connectionbroker).CollectionName | %{Get-RDUserSession -CollectionName $_ -ConnectionBroker $connectionbroker | ?{$_.UserName -ne "Administrator"} | %{Invoke-RDUserLogoff -Force -HostServer $_.HostServer.ToString() -UnifiedSessionID $_.UnifiedSessionId.ToString()}}  

("servername.domain.local" ist natürlich nochmal ersetzt; Administrator-Konto ist Administrator)

Leider kann ich gerade keinen angemeldeten User abmelden. Würde das so funktionieren? Ich kenne mich mit Powersehll leider immer noch nicht gut aus. Der Parameter -WhatIf zum Testen funktioniert leider nicht für so eine Befehlskette.
Muss ich nicht noch den Name der Sammlung irgendwo angeben? Oder wird diese Variable durch den Get-RDSessionCollection Befehl gesetzt?

Ich habe jetzt die alte Batch gegen diese PS1-Datei erstzt und muss sie heute Abend mal laufen lassen. Ich würde trotzdem vorab wissen, ob noch ein Fehler drin steckt. Sonst hab ich erst morgen Abend die nächste Chance zum ausprobieren. face-smile

Unabhängig davon; aus reinem Interesse würde ich gerne Wissen warum auch der Administrator durch das Batch-Script aus der Ursprungsfrage auch abgemeldet wird obwohl doch dieses "eol=>" das verhindern sollte. Früher soll das funktioniert haben, aber mit Server 2012 scheinbar nicht mehr. Hat sich da etwas verändert? Was müsste verändert werden, damit es funktioniert und alle außer dem administrator abgemeldet werden?

Besten Dank bis hierher. Ich melde Erfolg bei Vollzug.
126919
126919 02.02.2016 aktualisiert um 19:12:19 Uhr
Goto Top
Zitat von @Winary:
Ich habe die Änderungen wie folgt vorgenommen:
Korrekt.
Muss ich nicht noch den Name der Sammlung irgendwo angeben?
Nein, es werden alle Sammlungen mit einer Schleife durchlaufen
Oder 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.
Winary
Winary 02.02.2016 um 21:21:59 Uhr
Goto Top
Dann kann ich ja beruhigt schlafen und gespannt auf morgen warten. face-smile Danke und guts Nächtle.
Winary
Winary 03.02.2016 um 12:43:26 Uhr
Goto Top
Hallo,

es hat wunderbar funktioniert. Alle User waren abgemeldet außer dem Administrator. Vielen Dank.

Grüße Winary