Windows zu bestimmter Zeit runterfahren



  • Hallo!
    Ich würde gerne ne Funktion schreiben mit der man Windows zu einer bestimmten Zeit runterfahren lassen kann. Will einen neuen Prozess starten lassen der dann ressourcenschonend zu na bestimmten Uhrzeit nen Befehl ausführt (z.B. shutdown)?
    Wenns sich aber um 1 Tag Verzögerung handelt kann ich ja da keinen
    Sleep(1*24*60*60*1000);
    machen oder?
    Würde mich über n paar gute Tips freuen 😉



  • Welches Windows hast du denn? Ein Freund hat mir nämlich gesagt dass es unter 2000 schon eine solche Funktion gibt, dann bräuchtest du sie nicht neu zu schreiben.



  • ja, hab Win2k, weißte zufällig wie die Funktion heißt oder nach was ich suchen kann?



  • Schau dir mal CreateWaitableTimer und SetWaitableTimer an 🙂



  • Ah, ja cool danke, ich checks mal 🙂



  • Hallo,

    ich hab über SetWaitableTimer immer nur gefunden, wie man da einen betimmte Zeit in ms angibt, würde aber gerne als Wartezeit eine Uhrzeit und ein Datum angeben. Kann mir da vielleicht jemand helfen?
    Schonmal Danke



  • Moin,

    versuche es doch mal mit GetSystemTime() oder so und vergleiche dann mit deiner
    Eingabe.
    Wenn beides gleich ist dann Shutdown.

    MFG

    RS



  • Oder errechne dir aus Systemzeit und gewünschter Shutdown-Zeit eine Differenz. Diese rechnest du in ms um und machst dann CreateWaitableTimer



  • pDueTime
    [in] Time after which the state of the timer is to be set to signaled, in 100 nanosecond intervals. Use the format described by the FILETIME structure. Positive values indicate absolute time. Be sure to use a UTC-based absolute time, as the system uses UTC-based time internally. Negative values indicate relative time. The actual timer accuracy depends on the capability of your hardware. For more information about UTC-based time, see System Time.

    Zur Verdeutlichung noch ein kleines Beispiel aus "Microsoft Windows Programmierung für Experten" von Jeffrey Richter:

    // Deklaration der lokalen Variablen
    HANDLE hTimer;
    SYSTEMTIME st = {0};
    FILETIME ftLocal, tfUTC;
    LARGE_INTEGER liUTC;
    
    // Einen Manual-Reset-Zeitgeber erstellen
    hTimer = CreateWaitableTimer(NULL,TRUE,NULL);
    
    // Signal am 1. Januar 2004 um 13 Uhr Ortszeit setzen
    st.wYear  = 2004;
    st.wMonth = 1;
    st.wDay   = 1;
    stwHour   = 13;
    
    SystemTimeToFileTime(&st,&ftLocal);
    
    // Ortszeit in UTC-Zeit umwandeln
    LocalFileTimeToFileTime(&ftLocal,&ftUTC);
    // FILETIME-Format in das LARGE_INTEGER-Format umwandeln, um Daten passend auszurichten
    liUTC.LowPart  = ftUTC.dwLowDateTime;
    liUTC.HighPart = ftUTC.dwHighDateTime;
    
    // Zeitgeber einstellen
    SetWaitableTime(hTimer,&liUTC,0,NULL,NULL,FALSE);
    

    Das Beispiel habe ich (hoofentlich ohne Fehler 🙄 ) leicht abgeändert 😉



  • Denk dran, dass du für das Runterfahren unter NT die entsprechenden Rechte brauchst. Die kann man sich (soweit ich mich erinnere) mich AdjustTokenPrivileges holen.


Anmelden zum Antworten