hendrik2586
Goto Top

Autologoff Local User Windows 10 bei idle Time von 900 Sekunden

Hallo ihr lieben. face-smile 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

Content-ID: 551347

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

Ausgedruckt am: 21.11.2024 um 20:11 Uhr

beidermachtvongreyscull
beidermachtvongreyscull 25.02.2020 um 14:20:35 Uhr
Goto Top
Ich baue derzeit einen Logout-Automaten auf Basis von VBScript.

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.
Hendrik2586
Hendrik2586 25.02.2020 um 14:27:36 Uhr
Goto Top
Zitat von @beidermachtvongreyscull:

Ich baue derzeit einen Logout-Automaten auf Basis von VBScript.

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.


Das klingt genau wie das,was der Kunde sich wünscht. Die Idee klingt ebenfalls sehr plausibel. Vielleicht sollten wir uns hier einmal ein wenig mehr austauschen denn so richtig gibt es da noch keine funktionierende Lösung.
beidermachtvongreyscull
beidermachtvongreyscull 25.02.2020 aktualisiert um 14:43:19 Uhr
Goto Top
Ich zeige Dir mal, was ich bisher habe:

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. face-smile

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.
Hendrik2586
Hendrik2586 25.02.2020 um 14:46:02 Uhr
Goto Top
Zitat von @beidermachtvongreyscull:

Ich zeige Dir mal, was ich bisher habe:

> 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. face-smile

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.


Sehr, sehr nett. Ist aber RDP bzw. für TS Sitzungen und bringt mir leider glaube ich nicht so viel.... :/
beidermachtvongreyscull
beidermachtvongreyscull 25.02.2020 aktualisiert um 14:50:56 Uhr
Goto Top
Wieso nicht?

Du kannst durchaus solch ein Script als Login-Script via GPO vergeben.

Teste doch einfach bei Dir.

Mach eine Eingabeaufforderung auf und gib ein:

C:\windows\system32\shutdown.exe /l /f

Speichere nur vorher.
Hendrik2586
Hendrik2586 25.02.2020 um 14:55:55 Uhr
Goto Top
Zitat von @beidermachtvongreyscull:

Wieso nicht?

Du kannst durchaus solch ein Script als Login-Script via GPO vergeben.

Teste doch einfach bei Dir.

Mach eine Eingabeaufforderung auf und gib ein:

C:\windows\system32\shutdown.exe /l /f

Speichere nur vorher.


Ja gut dann gibt er mir eine Meldung, beendet meine Programme und meldet mich ab. :D

Ich sehe nur noch nicht wo du die Sekunden bis zur Abmeldung eingetragen hast. Datum, Uhrzeit errechung und eintrag schon.
beidermachtvongreyscull
beidermachtvongreyscull 25.02.2020 aktualisiert um 15:06:40 Uhr
Goto Top
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.
Hendrik2586
Hendrik2586 25.02.2020 um 15:08:44 Uhr
Goto Top
Zitat von @beidermachtvongreyscull:

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.


Heißt ich müsste in der Zeile:

varWaittime = DateDiff("s",varStartzeit,varEffectiveDate) * 1000  

etwas ändern oder? Ich bin so schlecht im Scripting eh. X-D
beidermachtvongreyscull
beidermachtvongreyscull 25.02.2020 aktualisiert um 15:22:16 Uhr
Goto Top
Der einfacherere Weg:

Zeile 61!

von
WshShell.Run "C:\windows\system32\shutdown.exe /l /f", 0, false  
ändern in

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.
DerWoWusste
DerWoWusste 25.02.2020 um 15:27:14 Uhr
Goto Top
Nimm mal den Task scheduler und erstelle einen Task, der als Systemkonto läuft und als Taskaktion
msg * Tada!
hat und als Trigger ein idle von einer Minute. Es sollte nach einminütiger Untätigkeit ein Popup erscheinen.
Hendrik2586
Hendrik2586 25.02.2020 um 15:40:34 Uhr
Goto Top
Zitat von @DerWoWusste:

Nimm mal den Task scheduler und erstelle einen Task, der als Systemkonto läuft und als Taskaktion
msg * Tada!
hat und als Trigger ein idle von einer Minute. Es sollte nach einminütiger Untätigkeit ein Popup erscheinen.


Diesen Weg verfolge ich gerade, aber irgendwie passiert dort auch nicht wirklich was. Obwohl ich noch keine Systemrechte erteilt habe.....hmmm
DerWoWusste
DerWoWusste 25.02.2020 um 15:43:49 Uhr
Goto Top
Obwohl ich noch keine Systemrechte erteilt habe
Was meinst Du damit? Der Task muss als "System" laufen, da msg * elevated laufen muss.
DerWoWusste
DerWoWusste 25.02.2020 um 15:50:56 Uhr
Goto Top
Hab's hier so probiert und es geht. Wenn der Idlezustand nicht erreicht wird, dann natürlich nicht!
Wie MS den definiert, kann man nachlesen.
Hendrik2586
Hendrik2586 25.02.2020 um 15:54:04 Uhr
Goto Top
Zitat von @DerWoWusste:

Hab's hier so probiert und es geht. Wenn der Idlezustand nicht erreicht wird, dann natürlich nicht!
Wie MS den definiert, kann man nachlesen.


Du hast es also als GPO eingerichtet ja? Als geplante Aufgabe oder Sofort?
DerWoWusste
DerWoWusste 25.02.2020 um 15:58:56 Uhr
Goto Top
Ich habe einen geplanten Task eingerichtet - ob manuell oder per GPO macht keinen Unterschied.
Hendrik2586
Hendrik2586 25.02.2020 um 16:00:19 Uhr
Goto Top
Zitat von @DerWoWusste:

Ich habe einen geplanten Task eingerichtet - ob manuell oder per GPO macht keinen Unterschied.

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.
Th0mKa
Th0mKa 26.02.2020 um 09:47:27 Uhr
Goto Top
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.

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
Hendrik2586
Hendrik2586 26.02.2020 um 10:37:09 Uhr
Goto Top
Zitat von @Th0mKa:

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.

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


NA da bin ich gespannt.
Th0mKa
Lösung Th0mKa 26.02.2020 um 11:49:52 Uhr
Goto Top
Zitat von @Hendrik2586:

NA da bin ich gespannt.

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
Hendrik2586
Hendrik2586 09.06.2020 um 08:27:38 Uhr
Goto Top
Leider habe ich es bis heute nicht zum laufen gebracht. Hat noch irgend jemand eine Idee?