Autologoff Local User Windows 10 bei idle Time von 900 Sekunden
Hallo ihr lieben. Ich hatte das Thema schon mal vor einer Weile, aber nun muss ich es nochmal aufrollen.
Ausgangspunkt: Windows Server 2016 und Windows 10 (1903) Clients.
Die Clients sind sehr restriktiv eingerichtet. Keine öffnen der Command Line, PowerShell oder TaskManager. Die User haben kein Zugriff auf Laufwerk C, sondern haben ein Laufwerk H das sie User-gebunden zugewiesen bekommen, das aber nach 24h gelöscht wird. Es handelt sich hier um eine Bibliothek mit ungefähr 25.000 Usern in ganz Deutschland, daher das löschen der Daten nach 24h und das wissen die Damen und Herren auch.
Nun läuft das alles wunderbar, nur loggen die Leute sich selten aus wenn sie das Gebäude verlassen und die PCs sind damit gesperrt. Genau das wollen wir nun unterbinden und möchten das die User nach 15 Minuten (900 sek) automatisch ausgeloggt werden. Kein Sperren, Bildschirmschoner oder ähnliches.
Nun habe ich es schon mit der Variante idlelogut.exe probiert, aber das klappt leider nicht wie hier beschrieben. (https://4sysops.com/archives/automatically-log-off-idle-users-in-windows ..)
Ich schätze das hat etwas mit der restriktiven Umgebung zu tun.
Nun möchte ich es über einen geplanten Task probieren, aber auch das will nicht wirklich laufen. Habe dafür diesen Ablauf genommen. (https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/window ...)
Hat irgendjemand schon etwas Ähnliches gesucht oder vielleicht selbst gebaut und das hin bekommen? Wenn ja dann würde ich mich sehr freuen wenn er sein Wissen mit mir teilt.
LG
Hendrik
Ausgangspunkt: Windows Server 2016 und Windows 10 (1903) Clients.
Die Clients sind sehr restriktiv eingerichtet. Keine öffnen der Command Line, PowerShell oder TaskManager. Die User haben kein Zugriff auf Laufwerk C, sondern haben ein Laufwerk H das sie User-gebunden zugewiesen bekommen, das aber nach 24h gelöscht wird. Es handelt sich hier um eine Bibliothek mit ungefähr 25.000 Usern in ganz Deutschland, daher das löschen der Daten nach 24h und das wissen die Damen und Herren auch.
Nun läuft das alles wunderbar, nur loggen die Leute sich selten aus wenn sie das Gebäude verlassen und die PCs sind damit gesperrt. Genau das wollen wir nun unterbinden und möchten das die User nach 15 Minuten (900 sek) automatisch ausgeloggt werden. Kein Sperren, Bildschirmschoner oder ähnliches.
Nun habe ich es schon mit der Variante idlelogut.exe probiert, aber das klappt leider nicht wie hier beschrieben. (https://4sysops.com/archives/automatically-log-off-idle-users-in-windows ..)
Ich schätze das hat etwas mit der restriktiven Umgebung zu tun.
Nun möchte ich es über einen geplanten Task probieren, aber auch das will nicht wirklich laufen. Habe dafür diesen Ablauf genommen. (https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/window ...)
Hat irgendjemand schon etwas Ähnliches gesucht oder vielleicht selbst gebaut und das hin bekommen? Wenn ja dann würde ich mich sehr freuen wenn er sein Wissen mit mir teilt.
LG
Hendrik
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 551347
Url: https://administrator.de/contentid/551347
Ausgedruckt am: 21.11.2024 um 20:11 Uhr
20 Kommentare
Neuester Kommentar
Ich baue derzeit einen Logout-Automaten auf Basis von VBScript.
Die Idee dahinter ist folgende:
Und ich sehe eine Erweiterbarkeit für Deinen Fall:
Dann könnte das Script nach einem festen Ablauf, ähnlich wie Totmannschaltung eines Zuges, nach einer Zeit X ein Formular einblenden, welches der Nutzer bestätigen soll. Tut er es, bleibt er weiterhin angemeldet und der Zeitraum, bis zur nächsten Abfrage wird etwas vergrößert. Tut er es nicht, erfolgt die Abmeldung.
Die Idee dahinter ist folgende:
- Das Script startet als Login-Script und läuft dann als Endlosschleife mit Sleep-Funktion. Dadurch bleibt es im Speicher, fordert aber nicht permanent CPU-Zeit an.
- Gehört ein Benutzer zur Nutzergruppe X, so wird seine Sitzung mit "Shutdown /L" in der Nacht abgemeldet.
- Die Sitzung eines jeden Nutzers wird in der Nacht zum Sonntag mit gleichem Befehl abgemeldet.
Und ich sehe eine Erweiterbarkeit für Deinen Fall:
Dann könnte das Script nach einem festen Ablauf, ähnlich wie Totmannschaltung eines Zuges, nach einer Zeit X ein Formular einblenden, welches der Nutzer bestätigen soll. Tut er es, bleibt er weiterhin angemeldet und der Zeitraum, bis zur nächsten Abfrage wird etwas vergrößert. Tut er es nicht, erfolgt die Abmeldung.
Ich zeige Dir mal, was ich bisher habe:
Es ist noch nicht fertig. Ich bin da noch dran.
Zur Erklärung:
Dieses Script beabsichtige ich auf unserer Terminalserverfarm einzusetzen. Meine Nutzer melden sich des nachts nicht ab. Deswegen will ich sie so aus dem System schubsen.
Das Problem:
Wenn man eine feste Zeit definiert, würden sich auf einen Schlag alle Nutzer zu dieser Zeit auch abmelden.
Deswegen hab ich eine Zufallsfunktion eingebaut, die ein Zeitfenster von 2 Stunden festlegt, in dem ein Nutzer abgemeldet wird.
Da das Script als Login-Script laufen wird und somit im Nutzerkontext, wird der Abmeldebefehl "shutdown /l" nur auf den jeweiligen Nutzer wirken.
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!"
'*** 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
Es ist noch nicht fertig. Ich bin da noch dran.
Zur Erklärung:
Dieses Script beabsichtige ich auf unserer Terminalserverfarm einzusetzen. Meine Nutzer melden sich des nachts nicht ab. Deswegen will ich sie so aus dem System schubsen.
Das Problem:
Wenn man eine feste Zeit definiert, würden sich auf einen Schlag alle Nutzer zu dieser Zeit auch abmelden.
Deswegen hab ich eine Zufallsfunktion eingebaut, die ein Zeitfenster von 2 Stunden festlegt, in dem ein Nutzer abgemeldet wird.
Da das Script als Login-Script laufen wird und somit im Nutzerkontext, wird der Abmeldebefehl "shutdown /l" nur auf den jeweiligen Nutzer wirken.
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
'Sub wait (sec)
' dim temp
' temp=timer
' do while timer-temp<sec
' loop
'end Sub
Ich hatte zwei IF-Schleifen nicht geschlossen. Der obige Code lässt sich ausführen.
Die zeitliche Bremse liegt in der Zeile
Wscript.Sleep varWaittime
Dieser Wert ist immer anders. Bei jeder Ausführung des Scripts, grenzt aber hier meinen Zielkorridor ein:
Sonntags ab 2 Uhr morgens + max. 120 Minuten.
In dieser Zeit würden alle Nutzer, die das Script ausführen abgemeldet werden.
ADDENDUM:
Ich glaube nun zu verstehen, was Du meinst. Du meinst, dass nach der Meldung noch ein Timeout kommt.
Das ist hier nicht implementiert. Du kannst den shutdown-Befehl aber mit der Option /t dahingehend erweitern.
Der einfacherere Weg:
Zeile 61!
von
ändern in
wobei XXX eine Angabe in Sekunden ist. Diese Angabe kann max. 315360000 (10 Jahre) sein.
Das einzige Problem ist, dass ich nicht mit VBScript herausfinden kann, ob der Nutzer idle ist oder am Arbeiten. Deswegen würde ich hier mit einem Bestätigungsformular arbeiten oder die Effektivzeit des Scripts in Stunden legen, wo sowieso niemand gestört wird.
Allerdings ist das bei einem Bibliotheksbetrieb nicht gewünscht, könnte ich mir vorstellen.
Zeile 61!
von
WshShell.Run "C:\windows\system32\shutdown.exe /l /f", 0, false
WshShell.Run "C:\windows\system32\shutdown.exe /l /t XXX", 0, false
wobei XXX eine Angabe in Sekunden ist. Diese Angabe kann max. 315360000 (10 Jahre) sein.
Das einzige Problem ist, dass ich nicht mit VBScript herausfinden kann, ob der Nutzer idle ist oder am Arbeiten. Deswegen würde ich hier mit einem Bestätigungsformular arbeiten oder die Effektivzeit des Scripts in Stunden legen, wo sowieso niemand gestört wird.
Allerdings ist das bei einem Bibliotheksbetrieb nicht gewünscht, könnte ich mir vorstellen.
Zitat von @Hendrik2586:
Bei einem so restriktiven System wie von mir oben geschrieben macht das keinen Unterschied? Hmmm.......das denke ich nicht. Ich werde aber dennoch deinen Vorschlag probieren.
Bei einem so restriktiven System wie von mir oben geschrieben macht das keinen Unterschied? Hmmm.......das denke ich nicht. Ich werde aber dennoch deinen Vorschlag probieren.
Natürlich macht das keinen Unterschied ob der Task per Hand oder per GPO eingerichtet wird. Wenn er da ist ist er da, völlig egal wie restriktiv das System eingerichtet ist.
/Thomas
Ich auch, das was du "sehr restriktiv" nennst ist das empfohlen Vorgehen auf Terminalservern und insofern nichts besonderes. Naja, bis auf das löschen der Inhalte des Homelaufwerks, da würden normale Nutzer vermutlich etwas verärgert reagieren.
/Thomas