Script, damit der PC nach 30 Minuten herunterfährt

  • Hi,
    ich muß ein Script schreiben, bei dem PC maximal 30 Minuten am Tag an sein darf.
    Dies habe ich soweit auch fertig und es funktioniert auch.

    Wenn der PC 20 Min an ist und dann neu gestartet wird, darf er noch 10 Min an sein - funktioniert soweit auch.

    Nun habe ich allerdings ein Problem.

    Wenn der PC 30 Min an ist, dann die Uhrzeit verstellt wird und neugestartet wird, darf der PC wieder 30 Min an sein.
    Wie könnte ich dies verhindern???

    PS: Es ist für ein 5 Jahre altes Kind

    Spoiler anzeigen
    [autoit]

    #include<Date.au3>
    #include<File.au3>
    #include<Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=Icon.ico
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUICloseOnESC", 0) ;beim drücken von ESC NICHT beenden
    #NoTrayIcon ;kein TrayIcon

    [/autoit] [autoit][/autoit] [autoit]

    ;genauer Pfad zu den einzubindenen Icons, Sounds und Grafiken
    FileInstall("U:\_AutoIt\aktuelle Finals\Kindersicherung\start.mp3", @TempDir & "\" & "start.mp3", 1)
    FileInstall("U:\_AutoIt\aktuelle Finals\Kindersicherung\wecker.mp3", @TempDir & "\" & "wecker.mp3", 1)

    [/autoit] [autoit][/autoit] [autoit]

    ; Tool-Infos
    $tool_version = "01 Test 10"
    $tool_titel = "Kindersicherung"

    [/autoit] [autoit][/autoit] [autoit]

    ;ini-Datei mit den Einstellungen
    $ini_einstellungen = @ScriptDir & "\" & "Kindersicherung Einstellungen.ini"
    $ini_zeit = @ScriptDir & "\" & "Kindersicherung Zeit.ini" ;wenn diese gelöscht wird, beginnt die Zeit von vorne zu laufen
    $ini_beenden = @ScriptDir & "\" & "Kindersicherung Programm beenden.ini" ;wenn diese nicht mehr existiert, beendet sich das Script

    [/autoit] [autoit][/autoit] [autoit]

    ;Sound-Datei Wecker
    $sound_start = @TempDir & "\" & "start.mp3"
    $sound_wecker = @TempDir & "\" & "wecker.mp3"

    [/autoit] [autoit][/autoit] [autoit]

    ;Zeit um das Script vor Beginn wieder zu stoppen
    $pause_scriptbeginn = 10 ;Sekunden

    [/autoit] [autoit][/autoit] [autoit]

    RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "HideClock", "REG_DWORD", 1) ;Uhr rechts unten ausblenden (erst nach ab- und anmelden wirksam)

    [/autoit] [autoit][/autoit] [autoit]

    ;Falls die Datei ... nicht existiert, diese erstellen (sonst läuft das Script nicht)
    If Not FileExists($ini_beenden) Then _FileCreate($ini_beenden)

    [/autoit] [autoit][/autoit] [autoit]

    ;Tool in den Autostart schreiben oder aus dem Autostart löschen
    $autostart_wert = IniRead($ini_einstellungen, "Autostart", "eintragen", "")
    If $autostart_wert = "ja" Then
    RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", "Kindersicherung", "REG_SZ", @ScriptFullPath)
    Else
    RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", "Kindersicherung")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;Hotkeys aktivieren
    HotKeySet("{TAB}", "_tool_beenden") ; Taste: TAB
    HotKeySet("{F7}", "_tool_beenden") ; Taste: F7
    HotKeySet("{RIGHT}", "_tool_beenden"); Taste: Pfeil rechts

    [/autoit] [autoit][/autoit] [autoit]

    ;Startsound spielen, damit man weiß wann das Script beginnt (ab hier hat man 10 Sekunden Zeit das Script zu beenden)
    SoundPlay($sound_start, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Sleep($pause_scriptbeginn*1000) ; 10 Sekunden um die Kindersicherung zu deaktivieren

    [/autoit] [autoit][/autoit] [autoit]

    ;Hotkeys wieder deaktivieren
    HotKeySet("{TAB}")
    HotKeySet("{F7}")
    HotKeySet("{RIGHT}")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Wochentag als Zahl
    $wochentag = _DateToDayOfWeek(@YEAR, @MON, @MDAY) ;1=Sonntag 2=Montag, ...

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Minuten, Datum auslesen
    $max_zeit_unter_der_woche = IniRead($ini_einstellungen, "unter der Woche", "max Minuten", "")
    $max_zeit_wochenende = IniRead($ini_einstellungen, "Wochenende", "max Minuten", "")
    $heute_an = IniRead($ini_zeit, "heute an", "verbrauchte Minuten", "") +$pause_scriptbeginn/60
    $letzter_start = IniRead($ini_zeit, "letzter start", "datum", "")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;prüfen, ob der PC heute schon an war
    If $letzter_start = "" Or $letzter_start <> _NowDate() Then
    IniWrite($ini_zeit, "letzter start", "datum", _NowDate()) ;heutiges Datum in ini schreiben
    $heute_an = 0 ;heute verbrauchte Minuten auf 0 setzen
    IniWrite($ini_zeit, "heute an", "verbrauchte Minuten", $heute_an)
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;sonstiger Tag oder Wochenende
    If $wochentag >= 2 And $wochentag <= 6 Then
    $max_zeit = $max_zeit_unter_der_woche
    Else
    $max_zeit = $max_zeit_wochenende
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;PC-Zeit bereits aufgebraucht?
    If $heute_an < $max_zeit Then ;Zeit aufgebraucht >>> Sound abspielen
    Do ;alle 10 Sekunden wird geprüft, ob die Zeit überschritten wurde (ini wird auch aktualisiert), falls ja >>> Sound abspielen
    If Not FileExists($ini_beenden) Then Exit ;Script beenden, falls die Datei ... nicht existiert
    $timer_beginn = TimerInit()
    sleep(10000) ; 10 Sekunden
    $heute_an = Round(TimerDiff($timer_beginn)/1000/60 + $heute_an, 2)
    IniWrite($ini_zeit, "heute an", "verbrauchte Minuten", $heute_an)
    Until $heute_an > $max_zeit
    EndIf
    If Not FileExists($ini_beenden) Then Exit ;Script beenden, falls die Datei ... nicht existiert

    [/autoit] [autoit][/autoit] [autoit]

    _shutdown()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _tool_beenden() ;Funktion um das Script nach dem Start direkt wieder zu beenden
    If _IsPressed("09") And _IsPressed("76") And _IsPressed("27") Then Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _shutdown() ;was der PC nach der max Zeit machen soll
    $meldung_pc_aus = IniRead($ini_einstellungen, "Meldung", "PC aus", "")
    $meldung_sound = IniRead($ini_einstellungen, "Meldung", "Sound", "")
    $meldung_minuten = IniRead($ini_einstellungen, "Meldung", "Minuten", "")

    If $meldung_pc_aus = "ja" And $meldung_sound = "ja" Then ;PC aus: "ja" Sound: "ja"
    $timer_beginn = TimerInit()
    Do
    SoundPlay($sound_wecker, 1)
    $Zeitunterschied = TimerDiff($timer_beginn)/1000
    Until $Zeitunterschied >= ($meldung_minuten*60) Or Not FileExists($ini_beenden) ;x Sekunden den Sound spielen, dann PC aus oder Script beenden, falls der Prozess oder die Datei ... nicht mehr existiert
    If FileExists($ini_beenden) Then Shutdown(5)
    Exit

    ElseIf $meldung_pc_aus <> "ja" And $meldung_sound = "ja" Then ;PC aus: "nein" Sound: "ja"
    Do
    SoundPlay($sound_wecker, 1) ;Sound unendlich
    Until Not ProcessExists(@ScriptName) Or Not FileExists($ini_beenden) ;Script beenden, falls der Prozess oder die Datei ... nicht mehr existiert

    ElseIf $meldung_pc_aus = "ja" And $meldung_sound <> "ja" Then ;PC aus: "ja" Sound: "nein"
    Shutdown(5)
    Exit

    EndIf
    EndFunc

    [/autoit]
  • Jo, momentan merke ich mir das Datum auch :)

    doch er ist sehr lernwillig und merkt sich genau, wenn jemand anderer was am PC macht wie das geht :D

  • Hi,

    ich würde mit dem Script ein Registryeintrag anlegen, und alle paar Minuten die aktuelle Uhrzeit sichern, sofern nicht manipuliert wurde. Wenn dann mal die Uhrzeit manipuliert worden ist, kann ich es durch Vergleich genau feststellen. Außerdem kann ich beim Starten die Uhrzeit prüfen, und z.B. sicherstellen das mindestens 12h seit dem "Verbrauch" der letzten 30min vergangen sind.

    Es ließe sich sogar so ausbauen, das wenn eine Zeitmanipulation festgestellt wird, der Rechner sofort runterfährt und sich nur nach Freigabe durch einen Admin wieder nutzen läßt.

    Gruß,

    TrueMu

  • Du kannst dem Kind das Recht die Systemuhr zu verändern per Windows POlicy entnehmen

  • [autoit]

    func _AendernVerhindern()
    While(1)
    WinWaitActive("Ändern von Datum und Uhrzeit")
    WinKill("Änderun von Datum und Uhrzeit")
    WEnd
    EndFunc
    AdlibEnable("_AendernVerhindern")

    [/autoit]
  • Du kannst dem Kind das Recht die Systemuhr zu verändern per Windows POlicy entnehmen

    OK danke, werde es in den Gruppenrichtlinien deaktivieren

    Danke :D