1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Mokkaschnitte

Beiträge von Mokkaschnitte

  • begrenzte Nutzungsdauer am PC: Konzeption technisch umsetzbar? (Kindersicherung)

    • Mokkaschnitte
    • 14. Dezember 2015 um 16:07

    So, ich habe das Skript weiter ausgebaut und verbessert, falls es jemand nutzen möchte. @Peter: das Rückstellen der Zeit dürfte auch schwer sein, da dies immer spätestens nach 59 Sek. geschehen müsste, der Counter zählt jede Minute stur hoch. Ist aber sowieso unwahrscheinlich, das Ding hat sich schon sehr gut bewährt.
    Beim ersten Start werden ggf. noch Standardwerte in der Reg angelegt und bei jeder ANmeldung wird angezeigt, wie viel Zeit noch über ist. Diese "zeitinfo" lässt sich auch gefahrlos jederzeit als eigenständige Datei (Desktop) starten, also auch durch die Kids.
    Außerdem habe ich noch ein recht komfortables Skript "einstellungen" erstellt, damit lassen sich alle Zeiten einfach modifizieren in der Reg. Die Skripte liegen wie bisher alle unter c:\windows\script (kann angepasst werden). Ließe sich an vielen Stellen sicher schöner programmieren, aber es läuft bisher zuverlässig!

    AutoIt: limit
    #NoTrayIcon
    #include <Constants.au3>
    #include <Date.au3>
    Local $skriptpfad = "c:\Windows\script\"
    Local $datum, $zeit, $limit, $handle_read, $limit
    Local $anzeige = 0
    
    
    ; Schreibe Standardwerte für Wochenende/Wochentag, falls noch nichts in der Reg
    $tmp = RegRead ("HKEY_CURRENT_USER\Software\timer", "Wochentage")
    if $tmp = "" then RegWrite ("HKEY_CURRENT_USER\Software\timer", "Wochentage", "REG_SZ", 45)
    $tmp = RegRead ("HKEY_CURRENT_USER\Software\timer", "Wochenende")
    if $tmp = "" then RegWrite ("HKEY_CURRENT_USER\Software\timer", "Wochenende", "REG_SZ", 60)
    
    
    ; allgemeines Limit für Wochenende oder Werktage auslesen
    if @WDAY = 1 OR @WDAY = 7 then
      $limit = 60
    Else
      $limit = 45
    EndIf
    
    
    ; Falls Wochentag-spezifisches Limit in der Reg, dann verwende dieses (von Schlüssel 1=Sonntag bis 7 = Samstag)
    $tmp = RegRead ("HKEY_CURRENT_USER\Software\timer", @WDAY)
    if $tmp <> "" then
    	$limit = RegRead ("HKEY_CURRENT_USER\Software\timer", @WDAY)
    EndIf
    
    
    ; schreibe heutiges Limit
    RegWrite ("HKEY_CURRENT_USER\Software\timer", "Limit", "REG_SZ", $limit)
    
    
    While True
    	$datum = RegRead ("HKEY_CURRENT_USER\Software\timer", "Datum")
    	$counter = RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter")
    	;Wenn sich Datum geändert hat (neuer Tag hat begonnen) Counter zurücksetzen
    	If Not ($datum = @YEAR & "-" & @MON & "-" & @MDAY) Then
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Counter", "REG_SZ", 0)
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Datum", "REG_SZ", @YEAR & "-" & @MON & "-" & @MDAY)
    	Else
    		; falls trotz abgelaufener Zeit nochmal neu angemeldet wird...
    		If $counter > $limit-1 Then
    			;MsgBox($MB_SYSTEMMODAL, "Hinweis zum Zeitlimit", "Heute stehen ingesamt " & $limit & " Minuten zur Verfügung." & @CRLF & "Davon sind noch count " & $counter & " Minuten übrig.", 20)
    			_Exit ()
    		EndIf
    	EndIf
    
    
    
    
    	;(neues) Datum setzen
    	RegWrite ("HKEY_CURRENT_USER\Software\timer", "Datum", "REG_SZ", @YEAR & "-" & @MON & "-" & @MDAY)
    
    
    	;Wenn Counter leer ist dann auf 0 sezten, sonst hochzählen
    	$tmp = RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter")
    	If $tmp == "" Then
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Counter", "REG_SZ", 0)
    	Else
    		$counter = RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter")
    
    
    		;nach Anmeldung Zeitinfo einmalig anzeigen lassen
    		if $anzeige = 0 Then
    			$anzeige = 1
    			run($skriptpfad&'zeitinfo.exe')
    		EndIf
    
    
    		Sleep (60000)
    		$counter = $counter + 1
    		; neuen Counter-Wert eintragen
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Counter", "REG_SZ", $counter)
    	EndIf
    
    
    		If $counter = $limit-5 Then
    			run($skriptpfad&'warnung.exe ' & $limit &' 5')
    			;_warnung ()
    		ElseIf $counter = $limit-2 Then
    			run($skriptpfad&'warnung.exe ' & $limit &' 2')
    			;_warnung ()
    		ElseIf $counter >= $limit Then
    			; Herunterfahren mit Meldung
    			run($skriptpfad&'exit.exe')
    			Sleep (5000)
    			; 1+4 = force-shutdown; 32+4 = force standby zum Testen
    			Shutdown(1+4)
    			Exit
    			;_Exit ()
    		EndIf
    WEnd
    
    
    Exit
    
    
    Func _Exit ()
    	  Beep(500, 500)
    	  Sleep (100)
    	  Beep(500, 500)
       MsgBox(16, "Vorsicht!", "Die Zeit für heute ist abgelaufen!" & @CRLF & @CRLF & "Der PC wird JETZT heruntergefahren", 15)
    	  Sleep (3000)
       ; 1+4 = force-shutdown; 32+4 = force standby zum Testen
       Shutdown(1+4)
       Exit
    EndFunc
    
    
    Func _warnung ()
    	Beep(500, 500)
    	Sleep (80)
    	Beep(500, 500)
    	MsgBox(16, "Vorsicht!", "Die Zeit für heute (" & $limit & " Minuten) ist fast abgelaufen!" & @CRLF & "Bitte die Programme beenden." & @CRLF & "Der PC fährt in " & $limit-$counter & " Minuten herunter!!!", 20)
    EndFunc
    Alles anzeigen
    AutoIt: warnung
    #NoTrayIcon
    
    
    if RegRead ("HKEY_CURRENT_USER\Software\timer", "Limit") <> "" AND RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter") <> "" Then
    	MsgBox(262144+65536, "Hinweis zum Zeitlimit", "Heute stehen ingesamt " & RegRead ("HKEY_CURRENT_USER\Software\timer", "Limit") & " Minuten zur Verfügung." & @CRLF & @CRLF & "Davon sind noch " & RegRead ("HKEY_CURRENT_USER\Software\timer", "Limit") - RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter") & " Minuten übrig.", 20)
    endif
    AutoIt: exit
    #NoTrayIcon
    #include <Constants.au3>
    #include <MsgBoxConstants.au3>
    
    
    Beep(500, 500)
    Sleep (80)
    Beep(500, 500)
    MsgBox(16, "Vorsicht!", "Die Zeit für heute ist abgelaufen!" & @CRLF & @CRLF & "Der PC wird JETZT heruntergefahren", 20)
    AutoIt: zeitinfo
    #NoTrayIcon
    
    
    if RegRead ("HKEY_CURRENT_USER\Software\timer", "Limit") <> "" AND RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter") <> "" Then
    	MsgBox(262144+65536, "Hinweis zum Zeitlimit", "Heute stehen ingesamt " & RegRead ("HKEY_CURRENT_USER\Software\timer", "Limit") & " Minuten zur Verfügung." & @CRLF & @CRLF & "Davon sind noch " & RegRead ("HKEY_CURRENT_USER\Software\timer", "Limit") - RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter") & " Minuten übrig.", 20)
    endif

    Neu:

    AutoIt: einstellungen
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <ColorConstants.au3>
    #include <FontConstants.au3>
    
    
    ; Zugangssperre
    #RequireAdmin
    
    
    While 1
    
    
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Zeitlimits festlegen", 310, 410, 192, 124)
    $Label1 = GUICtrlCreateLabel("Bitte Zeitlimit pro Wochentag eingeben, falls", 20, 4, 700, 17)
    $Label1 = GUICtrlCreateLabel("ohne Wert, werden die Werte unten verwendet.", 20, 26, 700, 17)
    $Label1 = GUICtrlCreateLabel("Montag (" & RegRead("HKEY_CURRENT_USER\Software\timer", "2") & "):", 50, 74, 80, 17)
    $Label2 = GUICtrlCreateLabel("Dienstag:", 50, 104, 80, 17)
    $Label3 = GUICtrlCreateLabel("Mittwoch:", 50, 134, 80, 17)
    $Label4 = GUICtrlCreateLabel("Donnerstag:", 50, 164, 80, 17)
    $Label5 = GUICtrlCreateLabel("Freitag:", 50, 194, 80, 17)
    $Label6 = GUICtrlCreateLabel("Samstag:", 50, 224, 80, 17)
    $Label7 = GUICtrlCreateLabel("Sonntag:", 50, 254, 80, 17)
    $Label6 = GUICtrlCreateLabel("Wochentage:", 20, 300, 100, 17)
    $Label7 = GUICtrlCreateLabel("Wochenende:", 20, 330, 100, 17)
    $Label8 = GUICtrlCreateLabel("Minuten", 180, 74, 70, 17)
    $Label9 = GUICtrlCreateLabel("Minuten", 180, 104, 70, 17)
    $Label10 = GUICtrlCreateLabel("Minuten", 180, 134, 70, 17)
    $Label11 = GUICtrlCreateLabel("Minuten", 180, 164, 70, 17)
    $Label12 = GUICtrlCreateLabel("Minuten", 180, 194, 70, 17)
    $Label13 = GUICtrlCreateLabel("Minuten", 180, 224, 70, 17)
    $Label14 = GUICtrlCreateLabel("Minuten", 180, 254, 70, 17)
    $Label15 = GUICtrlCreateLabel("Minuten", 180, 300, 70, 17)
    $Label16 = GUICtrlCreateLabel("Minuten", 180, 330, 70, 17)
    $Input1 = GUICtrlCreateInput(RegRead("HKEY_CURRENT_USER\Software\timer", "2"), 140, 70, 30, 21)
    $Input2 = GUICtrlCreateInput(RegRead("HKEY_CURRENT_USER\Software\timer", "3"), 140, 100, 30, 21)
    $Input3 = GUICtrlCreateInput(RegRead("HKEY_CURRENT_USER\Software\timer", "4"), 140, 130, 30, 21)
    $Input4 = GUICtrlCreateInput(RegRead("HKEY_CURRENT_USER\Software\timer", "5"), 140, 160, 30, 21)
    $Input5 = GUICtrlCreateInput(RegRead("HKEY_CURRENT_USER\Software\timer", "6"), 140, 190, 30, 21)
    $Input6 = GUICtrlCreateInput(RegRead("HKEY_CURRENT_USER\Software\timer", "7"), 140, 220, 30, 21)
    $Input7 = GUICtrlCreateInput(RegRead("HKEY_CURRENT_USER\Software\timer", "1"), 140, 250, 30, 21)
    $InputWT = GUICtrlCreateInput(RegRead("HKEY_CURRENT_USER\Software\timer", "Wochentage"), 140, 300, 30, 21)
    $InputWE = GUICtrlCreateInput(RegRead("HKEY_CURRENT_USER\Software\timer", "Wochenende"), 140, 330, 30, 21)
    
    
    $EscButton=GUICtrlCreateButton (" abbrechen ", 20, 370)
    $SaveButton=GUICtrlCreateButton (" Übernehmen ", 115, 370)
    $FertigButton=GUICtrlCreateButton (" Speichern ", 220, 370)
    GUICtrlSetBkColor($Input1, $CLR_MONEYGREEN)
    GUICtrlSetBkColor($Input2, $CLR_MONEYGREEN)
    GUICtrlSetBkColor($Input3, $CLR_MONEYGREEN)
    GUICtrlSetBkColor($Input4, $CLR_MONEYGREEN)
    GUICtrlSetBkColor($Input5, $CLR_MONEYGREEN)
    GUICtrlSetBkColor($Input6, 0xEECCCC)
    GUICtrlSetBkColor($Input7, 0xEECCCC)
    GUICtrlSetBkColor($InputWT, $CLR_MONEYGREEN)
    GUICtrlSetBkColor($InputWE, 0xEECCCC)
    GUICtrlSetFont($Label6, 9, $FW_BOLD)
    GUICtrlSetFont($Label7, 9, $FW_BOLD)
    GUICtrlSetFont($Label15, 9, $FW_BOLD)
    GUICtrlSetFont($Label16, 9, $FW_BOLD)
    GUICtrlSetFont($InputWT, 9, $FW_BOLD)
    GUICtrlSetFont($InputWE, 9, $FW_BOLD)
    
    
    GUISetState(@SW_SHOWNORMAL)
    #EndRegion ### END Koda GUI section ###
    
    
    Sleep (1000)
    Local $nMsg = 0
    
    
    While 1
    	$nMsg = GUIGetMsg()
    	Select
    		Case $nmsg = $FertigButton  OR $nmsg = $SaveButton
    			$tmp = GUICtrlRead ($Input7)
    			if $tmp < 9999 AND $tmp > 0 Then
    				RegWrite ("HKEY_CURRENT_USER\Software\timer", "1", "REG_SZ", $tmp)
    			Else
    				RegDelete ("HKEY_CURRENT_USER\Software\timer", "1")
    			EndIf
    
    
    			$tmp = GUICtrlRead ($Input1)
    			if $tmp < 9999 AND $tmp > 0 Then
    				RegWrite ("HKEY_CURRENT_USER\Software\timer", "2", "REG_SZ", $tmp)
    			Else
    				RegDelete ("HKEY_CURRENT_USER\Software\timer", "2")
    			EndIf
    
    
    			$tmp = GUICtrlRead ($Input2)
    			if $tmp < 9999 AND $tmp > 0 Then
    				RegWrite ("HKEY_CURRENT_USER\Software\timer", "3", "REG_SZ", $tmp)
    			Else
    				RegDelete ("HKEY_CURRENT_USER\Software\timer", "3")
    			EndIf
    
    
    			$tmp = GUICtrlRead ($Input3)
    			if $tmp < 9999 AND $tmp > 0 Then
    				RegWrite ("HKEY_CURRENT_USER\Software\timer", "4", "REG_SZ", $tmp)
    			Else
    				RegDelete ("HKEY_CURRENT_USER\Software\timer", "4")
    			EndIf
    
    
    			$tmp = GUICtrlRead ($Input4)
    			if $tmp < 9999 AND $tmp > 0 Then
    				RegWrite ("HKEY_CURRENT_USER\Software\timer", "5", "REG_SZ", $tmp)
    			Else
    				RegDelete ("HKEY_CURRENT_USER\Software\timer", "5")
    			EndIf
    
    
    			$tmp = GUICtrlRead ($Input5)
    			if $tmp < 9999 AND $tmp > 0 Then
    				RegWrite ("HKEY_CURRENT_USER\Software\timer", "6", "REG_SZ", $tmp)
    			Else
    				RegDelete ("HKEY_CURRENT_USER\Software\timer", "6")
    			EndIf
    
    
    			$tmp = GUICtrlRead ($Input6)
    			if $tmp < 9999 AND $tmp > 0 Then
    				RegWrite ("HKEY_CURRENT_USER\Software\timer", "7", "REG_SZ", $tmp)
    			Else
    				RegDelete ("HKEY_CURRENT_USER\Software\timer", "7")
    			EndIf
    
    
    			$tmp = GUICtrlRead ($InputWT)
    			if $tmp < 9999 AND $tmp > 0 Then
    				RegWrite ("HKEY_CURRENT_USER\Software\timer", "Wochentage", "REG_SZ", $tmp)
    			Else
    				RegDelete ("HKEY_CURRENT_USER\Software\timer", "Wochentage")
    			EndIf
    
    
    			$tmp = GUICtrlRead ($InputWE)
    			if $tmp < 9999 AND $tmp > 0 Then
    				RegWrite ("HKEY_CURRENT_USER\Software\timer", "Wochenende", "REG_SZ", $tmp)
    			Else
    				RegDelete ("HKEY_CURRENT_USER\Software\timer", "Wochenende")
    			EndIf
    
    
    			If $nmsg = $FertigButton Then
    				Exit
    			Else
    				ExitLoop
    			EndIf
    
    
    		Case $nmsg = $EscButton
    			GUIDelete($Form1)
    			Exit
    		Case $nmsg = $GUI_EVENT_CLOSE
    			GUIDelete($Form1)
    			Exit
    	EndSelect
    WEnd
    
    
    GUIDelete($Form1)
    WEnd
    Alles anzeigen
  • begrenzte Nutzungsdauer am PC: Konzeption technisch umsetzbar? (Kindersicherung)

    • Mokkaschnitte
    • 8. Dezember 2015 um 10:16

    Habe noch eine Meldung über die verfügbare Zeit als externes Skript erstellt, die man bei der Anmeldung angezeigt bekommt (ist auch gut zum Testen!). Einfach die kompilierten Dateien nachc:\windows\script kopieren und die svchost.exe (oder anderer Name) durch den RUN-Eintrag der Registry starten lassen. Hier die aktuelle Version, falls es jemand verwenden mag. Scheint bisher gut zu funktionieren, auch bei mehrmaliger (nacheinander) oder paralleler Anmeldung (verschiedene Benutzer).

    AutoIt: svchost.exe
    #NoTrayIcon
    #include <Constants.au3>
    #include <Date.au3>
    Local $skriptpfad = "c:\Windows\script\"
    Local $datum, $zeit, $limit, $handle_read, $limit
    Local $anzeige = 0
    
    
    ; Limit für Wochenende oder Werktags
    if @WDAY = 1 OR @WDAY = 7 then
      $limit = 60
    Else
      $limit = 45
    EndIf
    
    
    ; Falls Limit in der Reg, dann verwende dieses (von Schlüssel 1=Sonntag bis 7 = Samstag
    $tmp = RegRead ("HKEY_CURRENT_USER\Software\timer", @WDAY)
    if $tmp <> "" then
    	$limit = RegRead ("HKEY_CURRENT_USER\Software\timer", @WDAY)
    EndIf
    
    
    While True
    	$datum = RegRead ("HKEY_CURRENT_USER\Software\timer", "Datum")
    	$counter = RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter")
    	;Wenn sich Datum geändert hat (neuer Tag hat begonnen) Counter zurücksetzen
    	If Not ($datum = @YEAR & "-" & @MON & "-" & @MDAY) Then
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Counter", "REG_SZ", 0)
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Datum", "REG_SZ", @YEAR & "-" & @MON & "-" & @MDAY)
    	Else
    		; falls trotz abgelaufener Zeit nochmal neu angemeldet wird...
    		If $counter > $limit-1 Then
    			;MsgBox($MB_SYSTEMMODAL, "Hinweis zum Zeitlimit", "Heute stehen ingesamt " & $limit & " Minuten zur Verfügung." & @CRLF & "Davon sind noch count " & $counter & " Minuten übrig.", 20)
    			_Exit ()
    		EndIf
    	EndIf
    
    
    	if $anzeige = 0 Then
    		$anzeige = 1
    		run($skriptpfad&'zeitinfo.exe ' & $limit &' ' & $limit-$counter)
    		;MsgBox(262144+65536, "Hinweis zum Zeitlimit", "Heute stehen ingesamt " & $limit & " Minuten zur Verfügung." & @CRLF & @CRLF & "Davon sind noch " & $limit-$counter & " Minuten übrig.", 20)
    	EndIf
    
    
    	;(neues) Datum setzen
    	RegWrite ("HKEY_CURRENT_USER\Software\timer", "Datum", "REG_SZ", @YEAR & "-" & @MON & "-" & @MDAY)
    	;Wenn Counter leer ist dann auf 0 sezten, sonst hochzählen
    	$tmp = RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter")
    	If $tmp == "" Then
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Counter", "REG_SZ", 0)
    	Else
    		$counter = RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter")
    		Sleep (60000)
    		$counter = $counter + 1
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Counter", "REG_SZ", $counter)
    	EndIf
    
    
    		If $counter = $limit-5 Then
    			run($skriptpfad&'warnung.exe ' & $limit &' 5')
    			;_warnung ()
    		ElseIf $counter = $limit-2 Then
    			run($skriptpfad&'warnung.exe ' & $limit &' 2')
    			;_warnung ()
    		ElseIf $counter >= $limit Then
    			; Herunterfahren mit Meldung
    			run($skriptpfad&'exit.exe')
    			Sleep (5000)
    			; 1+4 = force-shutdown; 32+4 = force standby zum Testen
    			Shutdown(1+4)
    			Exit
    			;_Exit ()
    		EndIf
    WEnd
    
    
    Exit
    
    
    Func _Exit ()
    	  Beep(500, 500)
    	  Sleep (100)
    	  Beep(500, 500)
       MsgBox(16, "Vorsicht!", "Die Zeit für heute ist abgelaufen!" & @CRLF & @CRLF & "Der PC wird JETZT heruntergefahren", 20)
    	  Sleep (5000)
       ; 1+4 = force-shutdown; 32+4 = force standby zum Testen
       Shutdown(1+4)
       Exit
    EndFunc
    
    
    Func _warnung ()
    	Beep(500, 500)
    	Sleep (80)
    	Beep(500, 500)
    	MsgBox(16, "Vorsicht!", "Die Zeit für heute (" & $limit & " Minuten) ist fast abgelaufen!" & @CRLF & "Bitte die Programme beenden." & @CRLF & "Der PC fährt in " & $limit-$counter & " Minuten herunter!!!", 20)
    EndFunc
    Alles anzeigen


    Und die drei kleinen Skripte für die Meldungen (aus Sicherheitsgründen nicht im Hauptskript):

    AutoIt: zeitinfo.exe
    #NoTrayIcon
    #include <Constants.au3>
    #include <MsgBoxConstants.au3>
    
    
    if $cmdline[0]=2 then
       ;parameter übergeben
    else
       ;keine parameter übergeben
       exit
    endif
    
    
    MsgBox(262144+65536, "Hinweis zum Zeitlimit", "Heute stehen ingesamt " & $cmdline[1] & " Minuten zur Verfügung." & @CRLF & @CRLF & "Davon sind noch " & $cmdline[2] & " Minuten übrig.", 20)
    Alles anzeigen
    AutoIt: warnung.exe
    #NoTrayIcon
    #include <Constants.au3>
    #include <MsgBoxConstants.au3>
    
    
    if $cmdline[0]=2 then
       ;parameter übergeben
    else
       ;keine parameter übergeben
       exit
    endif
    
    
    Beep(500, 500)
    Sleep (80)
    Beep(500, 500)
    MsgBox(16, "Vorsicht!", "Die Zeit für heute (" & $cmdline[1] & " Minuten) ist fast abgelaufen!" & @CRLF & "Bitte die Programme beenden." & @CRLF & "Der PC fährt in " & $cmdline[2] & " Minuten herunter!!!", 20)
    Alles anzeigen
    AutoIt: exit.exe
    #NoTrayIcon
    #include <Constants.au3>
    #include <MsgBoxConstants.au3>
    
    
    Beep(500, 500)
    Sleep (80)
    Beep(500, 500)
    MsgBox(16, "Vorsicht!", "Die Zeit für heute ist abgelaufen!" & @CRLF & @CRLF & "Der PC wird JETZT heruntergefahren", 20)

    Fehlt nur noch eine kleine GUI mit #RequireAdmin, um den Counter in der Reg zurückzusetzen bzw. alternative Limits für die Wochentage festzulegen (Schlüssel 1-7). Spielt momentan aber keine große Rolle für mich...

  • begrenzte Nutzungsdauer am PC: Konzeption technisch umsetzbar? (Kindersicherung)

    • Mokkaschnitte
    • 7. Dezember 2015 um 15:32

    GerhardSchr: Stimmt schon, die beiden Routinen (Meldungen) sind ja auch noch unten drin, allerdings wäre es tatsächlich verhältnismäßig einfach, das Skript während der Meldung über den Tastmanager ausfindig zu machen und zu beenden. So läuft es einfach weiter, ganz unabhängig davon, ob die Meldung mit ok bestätigt wird, selbst nach 20 Sek. verschwindet oder durch den Taskmanager abgeschossen wird. Zumindest eine kleine Sicherheit, wenn auch nicht elegant. Wer lieber nur ein Skript verwendet, kann ja in Zeile 47 und 55 die Func wieder aktivieren und den Rest dort rausschmeißen.
    Ich habe allerdings noch nicht getestet, ob ich es via Taskplaner auf Adminkonto laufen lassen könnte, damit wäre das Skript komplett gesichert und externe Funktionen unnötig. Mache ich mal bei Gelegenheit, vermutlich wird dann der Pfad in HKEY_CURRENT_USER\Software\timer\ ein anderer sein, da anderer User... Falls ich allerdings eine simple GUI mache, die mir die Zeiten für die verschiedenen Tage in die Reg schreibe (mit #RequireAdmin), dann sollte es wieder passen. Wäre nur schlecht, wenn das Skript dann greift, sobald ich mich normal am admin-Konto anmelde :/

    Runa: ist mir nicht ganz klar - das Skript schläft doch immer 1 Minute zwischendurch, wie sollte es zu den vielen Schreibzyklen kommen? Ich habe mir auch die Regwerte angeschaut während der Laufzeit und abgewartet, da passiert jeweils eine Minute lang gar nichts, wenn ich irgendwelche Werte ändere. Daher kann ich den Zyklus mit 0,5 sek nicht nachvollziehen.
    Mit den Konten habe ich noch nicht genug Erfahrung, muss ich noch testen. Prinzipiell ist mir das normale Benutzerkonto am liebsten (dafür reicht die RUN in der registry), dann gibt es keine Konflikte. Dass natürlich ein Skript, das durchgehend läuft, eher gefunden oder beendet werden kann als eines, das irgendwie anders getriggert wird, kann ich mir schon vorstellen. Prinzipiell wird der große zeitliche Rahmen allerdings sowieso durch meine Anwesenheit :rolleyes: und durch die Windows Jugendschutz-Einstellung gesetzt. Wenn da mal was schief geht, wäre das nicht wirklich schlimm... Wenngleich ich es eher für unwahrscheinlich halte...

  • begrenzte Nutzungsdauer am PC: Konzeption technisch umsetzbar? (Kindersicherung)

    • Mokkaschnitte
    • 6. Dezember 2015 um 20:48

    Noch ein paar Hinweise offtopic:

    • kompilierte Skripte lassen sich bei Trendmicro zwar via Scite starten und korrekt kompilieren, beim ersten Start jedoch (teilweise wohl sogar trotz Ordnerausschluss in TrendMicro!) wird die exe verändert und lässt sich nicht starten. Abhilfe: die exe nach dem Kompilieren einfach schreibschützen! Dieser Eingriff erfolgt ärgerlicherweise ohne jeden Eintrag in der Log oder sonstwie. Bei Zeitgesteuerten Suchen erfolgt zwar ein Eintrag, dafür ist die exe dann weg - also unbedingt Ausschüsse definieren.
    • bei Avast wird die exe nicht in Systemverzeichnissen (Win oder Programme) ausgeführt, sofern die Dateien bzw. Ordner nicht in Avast ausgeschlossen sind (siehe auch mein vorletzer Hinweis).
    • Zwischendurch hatte ich den Fehler "unable to open the script" beim Starten der exe (aktuelles Scite und korrekter Code, der auch in Scite ausführbar war!). Nach langer Suche fand ich den Fehler: es ware die falsche CodePage. Nach Umstellen auf UTF-8 und ersetzen der falschen Umlaute lief das Skript mit etwas Glück (gab manchmal wohl noch "unsichtbare" falsche Zeichen), wirklich sicher geholfen hat allerdings der folgende Vorgang: Code nach Notepad kopieren und dann speichern mit Codepage UTF-8 (nit ANSI). Mit dieser Datei hatte ich anschließend keine Probleme mehr.

    Falls jemand mal ähnliche Schwierigkeiten haben soll...
    Alina: dieses Tool hatte ich tatsächlich zuvor getestet, nur läuft das leider nicht mehr unter Windows 7. Sieht aber klasse aus und war sicher eine Menge Arbeit!

    Ansonsten wegen Sicherheit:momentan starte ich es einfach über den Eintrag RUN in der Registry, den kennen Laien in der Regel wohl nicht. Bei geschickten Namen/Orten für die exe dürfte es ferner schwierig sein, diese zu finden (zwecks Beenden durch den Taskmanager). Ich werde mal noch ausprobieren, ob sich das Skript nicht wie beschrieben im Aufgabenplaner mit Administratorrechten starten lässt, damit wäre es ziemlich wasserdicht. Theoretisch könnten die Werte für das Skript (Limit etc) ja auch in einer Datei ruhen mit reiner Leseberechtigung. Ich denke ebenfalls, dass eine gute Rechtevergabe jegliches Verstecken unnötig machen sollte.

  • begrenzte Nutzungsdauer am PC: Konzeption technisch umsetzbar? (Kindersicherung)

    • Mokkaschnitte
    • 6. Dezember 2015 um 20:35

    So, jetzt endlich wie verprochen der Code.
    Zunächst das Hauptscript, Skripte liegen momentan einfach in c:\Windows\script\ und damit schreibgeschützt (aber zu finden).

    AutoIt: timer
    #NoTrayIcon
    #include <Constants.au3>
    #include <Date.au3>
    Local $skriptpfad = "c:\Windows\script\"
    Local $datum, $zeit, $limit, $handle_read, $limit
    ; Limit für Wochenende oder Werktags
    if @WDAY = 1 OR @WDAY = 7 then
      $limit = 60
    Else
      $limit = 30
    EndIf
    ; Falls Limit in der Reg, dann verwende dieses (von Schlüssel 1=Sonntag bis 7 = Samstag
    $tmp = RegRead ("HKEY_CURRENT_USER\Software\timer", @WDAY)
    if $tmp <> "" then
    	$limit = RegRead ("HKEY_CURRENT_USER\Software\timer", @WDAY)
    EndIf
    While True
    	$datum = RegRead ("HKEY_CURRENT_USER\Software\timer", "Datum")
    	$counter = RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter")
    	;Wenn sich Datum geändert hat (neuer Tag hat begonnen) Counter zurücksetzen
    	If Not ($datum = @YEAR & "-" & @MON & "-" & @MDAY) Then
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Counter", "REG_SZ", 0)
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Datum", "REG_SZ", @YEAR & "-" & @MON & "-" & @MDAY)
    	Else
    		; falls trotz abgelaufener Zeit nochmal neu angemeldet wird...
    		If $counter >= $limit Then
    			_Exit ()
    		EndIf
    	EndIf
    	;(neues) Datum setzen
    	RegWrite ("HKEY_CURRENT_USER\Software\timer", "Datum", "REG_SZ", @YEAR & "-" & @MON & "-" & @MDAY)
    	;Wenn Counter leer ist dann auf 0 sezten, sonst hochzählen
    	$tmp = RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter")
    	If $tmp == "" Then
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Counter", "REG_SZ", 0)
    	Else
    		$counter = RegRead ("HKEY_CURRENT_USER\Software\timer", "Counter")
    		Sleep (60000)
    		$counter = $counter + 1
    		RegWrite ("HKEY_CURRENT_USER\Software\timer", "Counter", "REG_SZ", $counter)
    	EndIf
    		If $counter = $limit-5 Then
    			run($skriptpfad&'warnung.exe ' & $limit &' 5')
    			;_warnung ()
    		ElseIf $counter = $limit-2 Then
    			run($skriptpfad&'warnung.exe ' & $limit &' 2')
    			;_warnung ()
    		ElseIf $counter >= $limit Then
    			; Herunterfahren mit Meldung
    			run($skriptpfad&'exit.exe')
    			Sleep (5000)
    			; 1+4 = force-shutdown; 32+4 = force standby zum Testen
    			;Shutdown(1+4)
    			Exit
    			;_Exit ()
    		EndIf
    WEnd
    Func _Exit ()
    	  Beep(500, 500)
    	  Sleep (100)
    	  Beep(500, 500)
       MsgBox(16, "Vorsicht!", "Die Zeit für heute ist abgelaufen!" & @CRLF & @CRLF & "Der PC wird JETZT heruntergefahren", 20)
    	  Sleep (5000)
       ; 1+4 = force-shutdown; 32+4 = force standby zum Testen
       Shutdown(1+4)
       Exit
    EndFunc
    Func _warnung ()
    	Beep(500, 500)
    	Sleep (80)
    	Beep(500, 500)
    	MsgBox(16, "Vorsicht!", "Die Zeit für heute (" & $limit & " Minuten) ist fast abgelaufen!" & @CRLF & "Bitte die Programme beenden." & @CRLF & "Der PC fährt in " & $limit-$counter & " Minuten herunter!!!", 20)
    EndFunc
    Alles anzeigen

    Unter HKEY_CURRENT_USER\Software\timer\ könnten Schlüssel 1-7 angelegt werden für die Wochentage So-Sa, um alternative Limits festzulegen. Ansonsten gelten in diesem Fall 60 Min fürs Wochendende und 45 Min unter der Woche (siehe Parameter am Beginn). Wäre sicher fein, diese Parameter mit einem Extraskript flott neu konfigurieren zu können, mache ich vielleicht noch...

    Dann das Script, das die Warnung anzeigt ein paar Minuten vor shutdown:

    AutoIt: warnung
    #NoTrayIcon
    #include <Constants.au3>
    #include <MsgBoxConstants.au3>
    
    
    if $cmdline[0]=2 then
       ;parameter übergeben
    else
       ;keine parameter übergeben
       exit
    endif
    
    
    Beep(500, 500)
    Sleep (80)
    Beep(500, 500)
    MsgBox(16, "Vorsicht!", "Die Zeit für heute (" & $cmdline[1] & " Minuten) ist fast abgelaufen!" & @CRLF & "Bitte die Programme beenden." & @CRLF & "Der PC fährt in " & $cmdline[2] & " Minuten herunter!!!", 20)
    Alles anzeigen

    Und das Skript mit der Warnung direkt vor shutdown:

    AutoIt: exit
    #NoTrayIcon
    #include <Constants.au3>
    #include <MsgBoxConstants.au3>
    
    
    Beep(500, 500)
    Sleep (80)
    Beep(500, 500)
    MsgBox(16, "Vorsicht!", "Die Zeit für heute ist abgelaufen!" & @CRLF & @CRLF & "Der PC wird JETZT heruntergefahren", 20)
  • begrenzte Nutzungsdauer am PC: Konzeption technisch umsetzbar? (Kindersicherung)

    • Mokkaschnitte
    • 6. Dezember 2015 um 19:03

    So, ich habe jetzt ein funktionierendes Script, kann in der Reg auch pro Wochentag optional eine anderes Zeitlimit einsetzen, falls man das möchte. Außerdem habe ich die Meldungen vor Ablauf doch wieder in ein eigenes kleines Script gepackt, damit sich das Hauptscript nicht via Taskmanager finden lässt. Sollte für meine Zwecke völlig ausreichen.
    Übrigens: sobald ich bspw. das exit.exe (nur MsgBox mit Meldung) in ein Systemverzeichnis (unter Win oder Programme) verschiebe, muss ich es in Avast freigeben, sonst lässt es sich nicht starten. Ich poste den Code nachher noch, sobald ich einen Moment mehr Zeit habe. Danke aber für die vielen Tipps!!

  • begrenzte Nutzungsdauer am PC: Konzeption technisch umsetzbar? (Kindersicherung)

    • Mokkaschnitte
    • 5. Dezember 2015 um 13:48

    Oh, an svchost.exe hatte ich auch schon gedacht, mir war nur noch nicht klar, dass die ausgeblendet werden. Bei XP sah man die noch, oder? Ich habe jetzt bereits eine Variante mit zwei Skripts zum Laufen gebracht (eine für die Meldung), aber das könnte ich dann ja getrost in ein Skript packen, oder? Muss ich mal testen...
    Außerdem den RUN-Schlüssel - die unter HKEY_CURRENT_USER sollten wohl auch nur für das betreffende Nutzerkonto gelten, oder?
    Danke! :thumbup:

  • begrenzte Nutzungsdauer am PC: Konzeption technisch umsetzbar? (Kindersicherung)

    • Mokkaschnitte
    • 5. Dezember 2015 um 12:15

    Herzlichen Dank für die vielen Inspirationen in so kurzer Zeit! Ist ja doch ein recht emotionales Thema trotz des technischen Hintergrundes. Nur um es ins rechte Licht zu rücken: Irgendeine Form von Überwachung soll dadurch in keiner Weise ermöglicht werden auch keine Bevormundung, sondern in meinem Fall das Gegenteil: aktuell darf die Große (11J) nur den PC starten (und ggf. spielen), wenn ich auch im Haus bin. Also im weitesten Sinne unter Beaufsichtigung. Für ihr Konto mit Internet soll das auch so bleiben. Aber ich möchte ihr ein zweites Konto ohne Kennwort einrichten, das zwar kein Internet ermöglicht (MS Jugendschutz etc.), dafür aber bspw. 1h/Wochentag Spielzeit. Und zwar auch in meiner Abwesenheit. Ich bin ja selbst Lehrer und bzgl. Medienerziehung nicht ganz unbeleckt, mir geht es unterm Strich dabei tatsächlich um mehr Freiheiten.
    Aber zur technischen Frage: Ich habe bereits eine simple und offenbar funktionstüchtige Lösung mit einer kleinen Textdatei irgendwo auf dem PC fertig und es scheint auch zu laufen (wenn alles fertig ist, kopiere ich den Code gerne). Unterm Strich gefällt mir der Gedanke, den Wert einach in die Reg zu schreiben schon deshalb als gut, weil die Befehle dafür ja recht überschaubar sind und ich auch nicht mehr als 1-2 Werte speichern möchte. Eine Textdatei kann mal gelöscht sein oder die Rechte stimmen nicht, außerdem benötigt es (zumindest in meiner aktuellen Fassung) mehr Code. Übrigens lässt sich die regedit.exe NICHT über den Jugendschutz blockieren, das verbietet Windows. Allerdings muss das Ding ja auch wirklich nicht "Kindersicherung" oder so heißen und ist damit selbst für erfahrene User wohl kaum zu finden.
    Außerdem teste ich mal die Hinweise zum verdeckten Start des Codes, mal sehen, welche Lösung am elegantesten ist, zum Testen hatte ich das nur im normalen Autostart und das wäre natürlich etwas trivial. Obwohl - wenn die Rechte stimmen, düfte sich auch dagegen wenig unternehmen lassen. Ich war mir nur noch nicht sicher, ob ein Shutdown unter admin-Rechten (tastplaner?) tatsächlich zuverlässig ist oder ob das dann besser unter dem Nutzerkonto läuft. Im Taskmanager dürfte das kaum zu finden sein, falls der Name geschickt gewählt wird, von daher... Außer: ich hatte eine Benachrichtigung 5 Min vor ABlauf etc. per MsgBox realisiert, vermutlich ließe sich diese (so lange sichtbar) im Taskmanager finden und dann abschießen. Aber wohl nur, sofern dafür nicht einfach ein anderes Skript (zur Anzeige) vom Hauptskript angestoßen wird :)

  • begrenzte Nutzungsdauer am PC: Konzeption technisch umsetzbar? (Kindersicherung)

    • Mokkaschnitte
    • 3. Dezember 2015 um 11:38

    Hallo zusammen, nachdem ich intensiv nach ähnlichen Projekten gesucht habe und nach kleinen alternativen Tools, aber nichts verwertbares fand, möchte ich hier kurz anfragen, ob sich ein geplantes Projekt zumindest technisch überhaupt umsetzen lässt.

    • Sinn und Zweck: es gibt am Win7-PC einen Benutzer "Spiele", deren Anmeldezeiten sich über die win-eigene Kindersicherung ja festlegen lassen. Leider aber nicht die tatsächliche Nutzungsdauer, die sich ja auch über mehrere Anmeldungen am Tag verteilen kann.
    • Ziel: Über den Aufgabenmanager möchte ich ein Skript im Hintergrund laufen lassen (ggf. mit Sperrung des Taskmanagers), das die Zeit im Hintergrund mitzählt und dann nach einer entsprechenden Meldung den PC abschaltet.
    • Vorab: ich weiß, dass sich mit entsprechendem Fachwissen quasi jede Lösung aushebeln lässt, dazu gibt es aber bereits genug Diskussionen und das soll hier auch nicht das Thema sein).

    Konzeptionell stelle ich es mir folgendermaßen vor:

    • Das Skript schaut in einem festgelegten Ordner (klar, ist unsicher...), ob es bereits eine Textdatei der Form mmdd.txt gibt. Falls nein, dann alle txt dort löschen und eine neue mmdd.txt anlegen.
    • In regelmäßigen Abständen (jede 1 oder 5 Minuten) liest das Skript die txt aus (es steht nur die abgelaufene Zeit als Minutenzahl drin) und addiert weitere 1 oder 5 Minuten hinzu und aktualisiert die txt (wohl über FileReadLine/FileWrite?). Nach 15 Minuten sollte also schlicht die Zahl 15 in der Datei stehen.
    • Sollte diese Zahl die erlaubte Nutzungsdauer überschreiten, erfolgt zunächst eine oder mehrere Meldungen und dann etwas später ein Shutdown ;( .

    Mir ist klar, dass das System einerseits sehr davon abhängt, dass der Ordner (kann ja geschickt versteckt sein) mit den txt nicht entdeckt wird. Ferner dass das Skript nicht irgendwie abgeschossen wird, aber meine Kids sind da noch sehr unbedarft und ab Win8/10 lässt sich das meines Wissens ja sowieso über den MS-Jugenschutz einstellen. Daher nur eine Zwischenlösung.
    Nur: Unter welchem Konto müsste ich das Skript laufen lassen, damit sowohl die Meldung korrekt angezeigt wird, als auch ein Shutdown sicher durchgeführt wird?
    Und: gibt es noch andere Punkte, die hier Probleme verursachen könnten?
    Danke!

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™