Seite 1 von 1

Win10-Zeit automatisch aktualisieren

Verfasst: Dienstag 20. April 2021, 18:45
von NWA
Hallo,
ich versuche schon den ganzen Tag meine Systemzeit automatisch zu aktualisieren. Ich habe schon ein Weile das Problem das meine lokale Zeit einmal die Woche eine Sekunde nach geht und sich deswegen der server vom websocket beschwert. Ich habe das Problem schon längere Zeit und dachte, dass wenn ich einen neuen NTP-server eintrage, automatisch aktualisiere usw., dann dürfte das Problem sich erledigen- hat es aber nicht. Ich verstehe auch nicht wieso Win10 nicht einfach nach seinen 32768 Sekunden automatisch eine Aktualisierung durchführt..

Ich habe also heute einen code zusammengebastelt, um die Zeit automatisch zu aktivieren, wenn ein except ausgelöst wird. Der geht aber nicht so richtig, bzw. ich kann es nicht testen, weil ich den Dienst nicht über cmd starten kann:

Code: Alles auswählen

from elevate import elevate
import os
import ctypes

elevate()  # admin-Rechte erlangen
os.system('cmd /c "net start w32time"')  # Dienst starten
os.system('cmd /c "w32tm /resync"')  # Windows-Zeit aktualisieren
Mein Test-Szenario würde im besten Fall so aussehen:
-Automatische Aktualisierung ausschalten
-Zeit manuell umstellen
-Programm starten
-Zeit wird richtig eingestellt

Tut es aber nicht.

Re: Win10-Zeit automatisch aktualisieren

Verfasst: Dienstag 20. April 2021, 21:27
von Dennis89
Hallo,

ich kann es leider nicht testen und du hast leider keinen Fehlercode gepostet.
Es gibt das Modul 'subprocess' damit kannst du Befehle ausführen lassen. In der Doku von 'subprocess' findest du auch eine Tabelle in der die 'os'-Befehle mit den neuen 'subprocess'-Befehlen gegenüber gestellt werden. Die manuelle Eingabe von beispielsweise "net start w32time" würde so aussehen:

Code: Alles auswählen

from subprocess import run

run(["net", "start", "w32time"], check=True)
Poste mal bitte deinen vollständigen Fehlercode.


Grüße
Dennis

Re: Win10-Zeit automatisch aktualisieren

Verfasst: Mittwoch 21. April 2021, 13:19
von NWA
Hi Dennis,
vielen Dank für deine Antwort. Ich habe mich heute (wieder nur) mit der Zeit beschäftigt. Nach Status-Ausgabe scheint es jetzt zu gehen. Ich würde das aber gerne nochmal testen.
Leider benötigt mein code Uhrzeit automatisch festlegen (Windows-Einstellungen, "Datum und Uhrzeit"). Dieser Knopf scheint den ganzen Dienst zu beenden. Denn, wenn ich diesen drücke, dann werden vom Windows-Zeitgeber die Knöpfe "Starten" und "Beenden" ausgegraut. Verwirrend ist jedoch, dass ich den Windows-Zeitgeber über net start w32time starten kann- ohne das Uhrzeit automatisch festlegen aktiviert ist.

Ich müsste es also irgendwie schaffen, Uhrzeit automatisch festlegen zu aktivieren. Leider finde ich keine Hinweise wie das gehen soll.
Selbst wenn ich W32tm.exe als Admin starte, tut sich da nix.
Mein code:

Code: Alles auswählen

from elevate import elevate
import os
import ctypes
from time import sleep


def set_admin_privilegs():
    ct = 0
    print("Admin?:", ctypes.windll.shell32.IsUserAnAdmin())
    while ctypes.windll.shell32.IsUserAnAdmin() == 0 and ct <= 3:
        ct += 1
        print(ct, ": Kein Admin")
        elevate()
        sleep(1)
    if ctypes.windll.shell32.IsUserAnAdmin() == 1:
        print("Bin Admin")


if __name__ == '__main__':
    set_admin_privilegs()  # Admin-Rechte erlangen
    os.system('cmd /c "net stop w32time"')  # Zeitgeber stoppen
    os.system('cmd /c "net start w32time"')  # Zeitgeber starten
    os.system('cmd /c "sc config w32time start= auto"')  # Starttyp "Automatisch"
    os.system('cmd /c "w32tm /config /update"')
    os.system('cmd /c "w32tm /resync"')  # Windows-Zeit aktualisieren
    os.system('cmd /c "w32tm /query /status"')  # Status
    # os.system('cmd /c "w32tm /query /configuration"')
    sleep(5)
    
Ausgabe wenn Uhrzeit automatisch festlegen aktiviert ist:

Code: Alles auswählen

Admin?: 1
Bin Admin
Windows-Zeitgeber wird beendet.
Windows-Zeitgeber wurde erfolgreich beendet.

Windows-Zeitgeber wird gestartet.
Windows-Zeitgeber wurde erfolgreich gestartet.

[SC] ChangeServiceConfig ERFOLG
Der Befehl wurde erfolgreich ausgeführt.
Befehl zum erneuten Synchronisieren wird an den lokalen Computer gesendet.
Der Befehl wurde erfolgreich ausgeführt.
Sprungindikator: 0(keine Warnung)
Stratum: 3 (Sekundärreferenz - synchr. über (S)NTP)
Präzision: -23 (119.209ns pro Tick)
Stammverzögerung: 0.0210345s
Stammabweichung: 7.7943333s
Referenz-ID: 0x824B0128 (Quell-IP:  130.75.1.40)
Letzte erfolgr. Synchronisierungszeit: 21.04.2021 14:16:00
Quelle: time2.rrzn.uni-hannover.de,0x9
Abrufintervall: 10 (1024s)