Kann man mit der WINAPI system-shutdown abbrechen?



  • Kann man mit der WINAPI system-shutdown abbrechen?
    Ich meine wenn z.b. das Fenster mit dem Countdown erscheint.

    Unter XP kann man einfach "shutdown -a" im cmd eingeben aber shutdown scheint es unter Win2k leider nciht zu geben ..

    Wie kann man das unter Win2K?



  • Du könntest die Shutdown-Nachricht (so in der Art WM_SHUTDOWN oder so - such einfach mal) mit -1 beantworten ... (ungetestet)

    Aber ich denke mal bei dem 60sek. Fenster wird der Shutdown schlauer gelöst sein (dunkle Vermutung 😉 )

    M.T.



  • AbortSystemShutdown ?!



  • Und wie hole ich mir den SE_SHUTDOWN_NAME-Privileg??
    Ich kann leider den erscheinenden Dialog des Systems cniht abbrechen lassen.
    Laut SDK müsste es klappen.

    -Danke für deine ANtwort.- zumindest habe ich nun den Funktionsnamen..



  • Habe das ganze hiermit realisiert aber es klappt nicht!

    //Programmcode
    int WINAPI WinMain(HINSTANCE hxInstance, HINSTANCE previnstance, PSTR myCommands, int ShowState) 
    { 
    
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 
    
    // Get a token for this process. 
    if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    	MessageBox( NULL,TEXT("Fehler beim holen des eigenen Privileg-Tokens"), TEXT("KeepOn © by KDSbest - Kann Passieren..."), MB_ICONWARNING);
    
    // Get the LUID for the shutdown privilege. 
    if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid))
    	MessageBox( NULL,TEXT("Fehler beim holen des Privileg-LUID"), TEXT("KeepOn © by KDSbest - Kann Passieren..."), MB_ICONWARNING);
    
    tkp.PrivilegeCount = 1;  // one privilege to set    
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    
    // Get the shutdown privilege for this process. 
    if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0)!=ERROR_SUCCESS)
    	MessageBox( NULL,TEXT("Fehler beim holen des Privilegs."), TEXT("KeepOn © by KDSbest - Kann Passieren..."), MB_ICONWARNING);
    
    if(AbortSystemShutdown(NULL))
    	MessageBox( NULL,TEXT("System-Shutdown-Prozess wurde erfolgreich verhindert.\n\rSie haben gesiegt."), TEXT("KeepOn © by KDSbest - Überflüssige Meldung"), MB_ICONWARNING);
    else
    	MessageBox( NULL,TEXT("Das System war zu blöd, den Shutdown-Prozess abzubrechen.\n\rDer Computer wird herunter gefahren."), TEXT("KeepOn © by KDSbest - Kann Passieren..."), MB_ICONWARNING);
    return 1;
    }
    

    Das lässt sich kompilieren und Ausführen und AbortSystemShutdown(NULL); returned IMMER nen Fehler. Auch wenn der shutdown-dialog aktiv ist.

    Wer kann helfen? Evtl. Vorschläge??

    Mfg.



  • bitte beleidigt mich. Ihr durft es!

    Ich Idiot habe immer die alte Version getestet und nciht die neukompilierte. Es klappt. Vielen dank @ all. Vor allem flenders und Tolga. 😉

    Mfg.



  • du könntest auch psshutdown nehmen damit gehts auch unter windows2000, einfach bei google psshutdown eigenben und es is da
    lg papanoah



  • Ich_bins_wieder schrieb:

    Habe das ganze hiermit realisiert aber es klappt nicht!

    //Programmcode
    int WINAPI WinMain(HINSTANCE hxInstance, HINSTANCE previnstance, PSTR myCommands, int ShowState) 
    { 
    
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 
     
    // Get a token for this process. 
    if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    	MessageBox( NULL,TEXT("Fehler beim holen des eigenen Privileg-Tokens"), TEXT("KeepOn © by KDSbest - Kann Passieren..."), MB_ICONWARNING);
    
    // Get the LUID for the shutdown privilege. 
    if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid))
    	MessageBox( NULL,TEXT("Fehler beim holen des Privileg-LUID"), TEXT("KeepOn © by KDSbest - Kann Passieren..."), MB_ICONWARNING);
    
    tkp.PrivilegeCount = 1;  // one privilege to set    
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    
    // Get the shutdown privilege for this process. 
    if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0)!=ERROR_SUCCESS)
    	MessageBox( NULL,TEXT("Fehler beim holen des Privilegs."), TEXT("KeepOn © by KDSbest - Kann Passieren..."), MB_ICONWARNING);
    
    if(AbortSystemShutdown(NULL))
    	MessageBox( NULL,TEXT("System-Shutdown-Prozess wurde erfolgreich verhindert.\n\rSie haben gesiegt."), TEXT("KeepOn © by KDSbest - Überflüssige Meldung"), MB_ICONWARNING);
    else
    	MessageBox( NULL,TEXT("Das System war zu blöd, den Shutdown-Prozess abzubrechen.\n\rDer Computer wird herunter gefahren."), TEXT("KeepOn © by KDSbest - Kann Passieren..."), MB_ICONWARNING);
    return 1;
    }
    

    Ich hoffe die Messageboxen waren nur zum Debuggen im Code. das ist absolut fürchterlicher Stil.

    Besser wäre:

    int tuwas()
    {
      if (!foo)
        return GetLastError();
      if (!bar)
        return GetLastError() 
    
      return 0;
    }
    

    dannliefert deine Funktion als Rückgabewert GetLastError zurück den du nit FormatMessage schön leserlich ausgeben kannst.



  • Manuel schrieb:

    Du könntest die Shutdown-Nachricht (so in der Art WM_SHUTDOWN oder so - such einfach mal) mit -1 beantworten ...

    Nur zur Ergänzung zu dem schon gesagten:
    Es gibt prinzipiell zwei Arten den Shutdown abzubrechen:
    1. Bei einem "normalen" Shutdown (also via ExitWindows oder das ("Start|Herunterfahren") kann man dies indem man auf die Nachricht "WM_QUERYENDSESSION" mit 0 antwortet. Diese Nachricht wird aber nur an Top-Level-Windows gesendet.

    2. Ein Shutdown, welcher mit "InitiateSystemShutdown(Ex)" eingeleitet wurde, kann man mit "AbortSystemShutdown" abbrechen.

    Nicht abbrechen kann man einen Shutdown mit "ExitWindowsEx" welcher mit dem Parameter EWX_FORCE aufgerufen wurde...



  • Hätte ich nicht die erste Anwort selbst geschrieben und jetzt nicht zufällig den Nick gelesen wäre s mir gar nicht aufgefallen ... aber ... welcher Freak gräbt nen 2 Jahre alten Beitrag aus? 😉

    Greetz


Anmelden zum Antworten