beidermachtvongreyscull
Goto Top

Terminalserver - automatische Abmeldung aller Benutzer innerhalb eines gesetzten Zeitfensters

Moin Kollegen,

ich wollte hier mal einen Ansatz vorstellen.

Das generelle Problem, das ich bisher immer sah war, dass ich entweder über Lösungen kam, die alle Nutzer fast zeitgleich rauswarfen (hohe Last) oder diese immer nur zu festlegbaren Intervallen abmeldeten.

Meine Nutzer wollten, dass sie während der Woche ihre Sitzungen auf den TS offenlassen können. Also bitte.

Der nachfolgende Ansatz macht es wie folgt:
  • Das Script kann im Autostart oder als Loginscript übergeben werden. Es läuft im Benutzerkontext.
  • Man definiert den gewünschten Auslösetag, die Startzeit des Auslösefensters und die Dauer des Fensters.
  • Innerhalb des Auslösefensters wird ein Pseudozufallszeitpunkt errechnet, dem Nutzer mitgeteilt und das Script wartet, bis dieser Zeitpunkt erreicht ist.
  • Dann führt es im Nutzerkontext den Befehl "shutdown /l /f" aus. Dieser meldet den Benutzer ab und schließt seine Sitzung.


Durch die Verschiebung der verschiedenen Auslösezeitpunkte, werden die Nutzer abgemeldet, ohne dass es zu gravierenden Überschneidungen kommen sollte.

varStartzeit = Now()
intStartzeitTag = Weekday(varStartzeit,2) 'Die "2" definiert Montag mit seiner Tagesnummer als Wochenbeginn. Dadurch bekommt "Montag" die Tagenummer "1". Standard wäre Sonntag = 1.  
varStartzeitZeit = TimeValue(varStartzeit)
intZielzeittag = 7 'Sonntag  
intTagesdifferenz = intZielzeittag - intStartzeitTag
varZielzeitBasisZeit = TimeValue("02:00:00")  
varWartungsfensterBeginn = TimeValue("06:00:00")  
varWartungsfensterEnde = TimeValue("12:00:00")  

'*** Falls wir uns im gesetzten Wartungsfenster (Zielzeittag + Wartungsfensterbeginn + Wartungsfensterende) befinden, erfolgt automatische Abmeldung  
If intStartzeitTag = intZielzeittag Then
	If Time() > varWartungsfensterBeginn AND Time() < varWartungsfensterEnde THEN
		Dim strMsg
		strMsg = ""  
		MsgBox Msg, vbExclamation or vbOKOnly + 4096, "Automatische Abmeldung wegen laufender Wartung!"  
	End If
End If

'*** Zufällige Minuten ***  
'Diese werden auf die Zielbasiszeit draufgerechnet, damit die abzumeldenden Sessions nicht zeitgleich abgemeldet werden.  
Dim max,min
max=120
min=1
Randomize
intZufallMinuten = (Int((max-min+1)*Rnd+min))

'*** Errechneter Abmeldezeitpunkt  
varZielzeitreal = DateAdd("n",intZufallMinuten,varZielzeitBasisZeit)  

'*** Errechnetes Abmeldedatum  
If intTagesdifferenz = 0 then 'Falls eine Sitzung am Tag mit derselben Tagesnummer gestartet wird, an der eigentlich Sitzungen abgemeldet werden, werden 7 Tage draufgerechnet.  
	varZielDatum = DateValue(DateAdd("d",7,varStartzeit))  
	else
		If intTagesdifferenz < 0 then
			varZieldatum = DateValue(DateAdd("d", 7 + intTagesdifferenz,varStartzeit))  
			Else
				varZielDatum = DateValue(DateAdd("d",intTagesdifferenz,varStartzeit))  
		End If
End If

'*** absoluter errechneter Abmeldezeitpunkt aus Datum und Uhrzeit  
varEffectiveDate = CDate(varZielDatum & " " & varZielzeitreal)  

'*** Wartezeit in Millisekunden  
varWaittime = DateDiff("s",varStartzeit,varEffectiveDate) * 1000  

'Ausnahmebehandlung, wenn negativer Wert errechnet wird. Das sollte nicht mehr passieren. Ist oben abgefangen.  
If varWaittime <= 0 Then
	WScript.Quit
End If

Dim Msg
 Msg = "Achtung!" & vbcr & "" & vbcr & "Beachten Sie bitte, dass eine automatische Abmeldung Ihrer Sitzung eingereiht wurde." & vbcr & "" & vbcr & "Da sowohl automatische Windows- als auch manuelle Updates eingespielt werden können, ist es wichtig, dass kein Benutzer an den Terminalservern angemeldet bleibt," & vbcr & "falls diese neustarten. Dies kann zu Schäden an den Userprofile-Disks führen, die Ihre persönlichen Einstellungen und Dateien enthalten." & vbcr & "" & vbcr & "Dies versuche ich zu verhindern, indem ich Ihre aktuelle Sitzung zum Zeitpunkt" & vbcr & "" & vbcr & varEffectiveDate & vbcr & "" & vbcr &  "abmelden werde." & vbcr & "" & vbcr & "LASSEN SIE BITTE ZU OBIGEM ZEITPUNKT KEINE DATEIEN OFFEN UND/ODER UNGESPEICHERT! ICH KANN DARAUF KEINE RÜCKSICHT NEHMEN!" & vbcr & "" & vbcr & "Vielen Dank für Ihr Verständnis!"  
MsgBox Msg, vbExclamation or vbOKOnly + 4096, "Automatische Abmeldung Ihrer Sitzung..."  

'Dynamische Pause, bis Zielzeitpunkt erreicht ist. Durch obige Berechnungen wird ein positiver Wert in Millisekunden ermittelt, der hier runtergezählt wird.  
Wscript.Sleep varWaittime

Set WshShell = WScript.CreateObject("WScript.Shell")  
WshShell.Run "C:\windows\system32\shutdown.exe /l /f", 0, false  
Wscript.Quit

Vielleicht gefällt Euch die Idee ja.

Und bitte immer erst in Laborumgebung testen, vor produktiver Inbetriebnahme.


Viele Grüße
bdmvg

* ADDENDUM *

Zusätzlich enthält das Script die Möglichkeit, dass während der definierten Wartungsphase die Leute auch automatisch wieder direkt die Abmeldung triggern. face-smile
Dazu kopiert man noch die Zeilen 59 und 60 und fügt sie ab Zeile 15 im Script ein.

Content-ID: 572840

Url: https://administrator.de/tutorial/terminalserver-automatische-abmeldung-aller-benutzer-innerhalb-eines-gesetzten-zeitfensters-572840.html

Ausgedruckt am: 23.12.2024 um 11:12 Uhr

St-Andreas
St-Andreas 20.05.2020 um 09:02:53 Uhr
Goto Top
Hallo,


ich verstehe das Problem nicht so ganz.

Warum sollten Benutzer die ganze Woche lang angemeldet bleiben dürfen?

Warum ist die temporäre hohe Last beim abmelden aller Benutzer ein Problem?

VG

Andreas
beidermachtvongreyscull
beidermachtvongreyscull 20.05.2020 um 09:41:02 Uhr
Goto Top
Zitat von @St-Andreas:

Hallo,

Moin,



ich verstehe das Problem nicht so ganz.

Warum sollten Benutzer die ganze Woche lang angemeldet bleiben dürfen?

Weil sie dann am nächsten Tag direkt dort fortsetzen können, wo sie aufgehört haben.


Warum ist die temporäre hohe Last beim abmelden aller Benutzer ein Problem?

Weil ich keine SSDs habe sondern Festplatten.
Weil das Timing dummerweise fest im System programmiert ist.


VG

Andreas

VG
bdmvg
Visucius
Visucius 20.05.2020 um 12:08:59 Uhr
Goto Top
Hm, ich meine, ich habe das über die Group-Policies gelöst?!

Abmeldung nach ... blah, blah Zeit, weil es sonst unendliche "Schattenanmeldungen" gab – was sich in meinem Miniumfeld nicht mit den Lizenzen vertrug.

VG
beidermachtvongreyscull
beidermachtvongreyscull 20.05.2020 um 12:14:57 Uhr
Goto Top
Über GPO kann ich eben nur relative Intervalle festlegen, die aber dann nicht zwingend auf ein fixes Zeitfenster hinauslaufen.

Mir war es aber wichtig, dass ab einem bestimmten Zeitpunkt in der Woche, die Sitzungen abgemeldet werden.

VG
Visucius
Visucius 20.05.2020 um 12:21:19 Uhr
Goto Top
Verstehe.

Gut zu wissen, wer weiß, wann ich das mal benötige.

PS: Und jetzt weiß ichs wieder: Waren nicht die Lizenzen, sondern Programm-Prozesse, die am falschen Schattenuser hingen und sich bei Neuanmeldung nicht starten ließen.
departure69
departure69 26.05.2020 um 08:01:58 Uhr
Goto Top
@beidermachtvongreyscull:

Hhmmm,

ich habe mal gelernt, daß RDS-/Terminalserver bzw. Citrix-Terminalserver

1. täglich einen Neustart brauchen
2. am Ende eines Tages die lokalen Profile gelöscht werden sollten

Ist das nicht mehr empfohlen?

Hiernach:

Meine Nutzer wollten, dass sie während der Woche ihre Sitzungen auf den TS offenlassen können

anscheinend nicht.

Wie sind da Deine Erfahrungen?

Es interessiert mich, weil wir wg. Home-Office am Überlegen sind, bei uns einen TS hinzustellen, damit die User zu Hause mit dem einfachsten Notebook auskommen, das man für möglichst günstiges Geld kriegen kann, Hauptsache der RDP- oder ICA-Client laufen, damit die Home-Geräte nicht denselben Arbeitsaufwand beim Einrichten und bei der lfd. Pflege erfordern wie die PCs in den Büros. Daß manches über TS nicht funktioniert, z. B. der Durchschliff von so mancher USB-Peripherie, ist uns dabei bewußt. Thin Clients sind keine Alternative, da diese nicht mobil sind, was die Heimarbeiter zu Hause ja sein wollen und mitunter auch müssen. Ganz davon abgesehen, daß nicht jeder ein Arbeitszimmer mit Schreibtisch zu Hause hat, und das Notebook mal am Küchentisch, mal am Wohnzimmertisch und vielleicht auch mal auf dem Teppich betrieben wird (letzteres wohl eher nicht face-wink).


Viele Grüße

von

departure69
Marc42
Marc42 26.05.2020 um 08:54:02 Uhr
Goto Top
Guten Morgen,
1) ein regelmäßiger TS Neustart war nur bei Windows 2000 sinnvoll.
Seit dem hat sich doch viel verbessert face-smile Aktuell ist das bei einem "ordendlich" konfiguriert TS Server nicht erforderlich.
2) Lokale Profile fressen Festplatten Speicher. Man sollte also genug Platz vorsehe, ggf Ordner umleiten und den Platzbedarf auch monitoren. Ein tägliches Löschen ist dann nicht erforderlich.

VG Marc
beidermachtvongreyscull
beidermachtvongreyscull 26.05.2020 um 10:56:22 Uhr
Goto Top
@departure69

Moin,

ich weiß nicht, ob das noch empfohlen wird. Meine Erfahrung bei unserem System hat mir gezeigt, dass es nicht sein muss. Die längste Laufzeit meiner TS liegt bei 74 Tagen ohne Neustart. Danach wurde es aber wirklich erforderlich. Und nein, ich spiele keine Windowsupdates ein. face-smile

Für mich ist diese Scriptlösung ein guter Kompromiss zwischen meinen Nutzern und meiner Systemwartung. Die Leute können an Ihren Arbeiten am nächsten Werktag derselben Woche fortsetzen ohne Zeitverlust.

Sonntagvormittags kann ich dann in einer ausgedehnten Phase größere Änderungen umsetzen und montags stehen die Maschinen wieder normal zur Verfügung.

Das Ergebnis spricht bisher für sich. Die Nutzer erhalten Änderungen, die sich in den Ablauf recht sauber integrieren lassen und ich weniger Gemaule und Gejammere. face-smile

Was Heimarbeitsplätze angeht, kann ich Dir folgendes sagen:

Wir haben bei Mediamarkt Billiglaptops zusammengekauft und günstig Windows 10 pro-Lizenzen geschossen. Ich hab die Dinger von Windows 10S (weiß der Teufel, wer auf diese Idee kam) auf Pro uminstalliert und gut ist.

Funktionieren einwandfrei.

Ich liebe Terminalserver. Ich würde nie mehr ohne arbeiten wollen.

Viele Grüße

bdmvg