Pc herunterfahren



  • Also, weil der letzte Thread eigentlich ein anderes Thema behandelt stelle ich meine Frage einmal hier.Ich habe in einem etwas größeren Programm einen Teil der den Pc ausschlaten soll. Das klappt aber ledier nicht.Ich habe also einen kleinen Test gemacht:

    #include <windows.h>
    #include <iostream>
    
    int main()
    {
    
    	ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);
    	return 0;
    
    }
    

    Das Programm geht mit dem Rückgabewert 0 aus aber der Pc bleibt an. Das selbe bei
    system("%systemroot%\System32\Shutdown.exe -s -f -t 0");

    Wieso geht der Pc nicht aus?

    Habe es auf einem Vista und auf einem anderen XP Rechner ausprobiert. Es geht nirgendwo...
    Weiß einer Rat?



  • #include <windows.h>
    #include <iostream>
    
    int main()
    {
    
    HANDLE hToken;              // handle to process token  
    TOKEN_PRIVILEGES tkp;       // pointer to token structure  
    
    BOOL fResult;               // system shutdown flag
    
    // Get the current process token handle so we can get shutdown
    // privilege.
    
    if (!OpenProcessToken(GetCurrentProcess(),
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
        ErrorHandler("OpenProcessToken failed.");
    
    // Get the LUID for shutdown privilege.
    
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
    
            &tkp.Privileges[0].Luid);
    
    tkp.PrivilegeCount = 1;  // one privilege to set    [c]
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    // Get shutdown privilege for this process.
    
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
        (PTOKEN_PRIVILEGES) NULL, 0);
    
    // Cannot test the return value of AdjustTokenPrivileges.
    
    if (GetLastError() != ERROR_SUCCESS)
        ErrorHandler("AdjustTokenPrivileges enable failed.");
    
    // Display the shutdown dialog box and start the time-out countdown.
    
    fResult = InitiateSystemShutdown(
        NULL,                                  // shut down local computer
        "Click on the main window and press \
         the Escape key to cancel shutdown.",  // message to user
        20,                                    // time-out period
        FALSE,                                 // ask user to close apps
        TRUE);                                 // reboot after shutdown
    
    if (!fResult)
    {
        ErrorHandler("InitiateSystemShutdown failed.");
    
    }
    
    // Disable shutdown privilege.
    
    tkp.Privileges[0].Attributes = 0;
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
            (PTOKEN_PRIVILEGES) NULL, 0);
    
    if (GetLastError() != ERROR_SUCCESS)
    {
        ErrorHandler("AdjustTokenPrivileges disable failed.");
    }
    
    If the AbortSystemShutdown function is executed in the time-out period specified by InitiateSystemShutdown, the system does not shut down. In this example, the user can prevent the system from shutting down by clicking on the application's main window and pressing the ESC key. The example processes the keystroke by calling AbortSystemShutdown.
    
    HANDLE hToken;              // handle to process token  
    TOKEN_PRIVILEGES tkp;       // pointer to token structure  
    
    BOOL fResult;               // system shutdown flag
    
    case WM_KEYDOWN:
    
        // Process only the Escape key.
    
        if (wParam != VK_ESCAPE)
        {
            break;
        }
    
        // Get the current process token handle  so we can get shutdown
        // privilege.
    
        if (!OpenProcessToken(GetCurrentProcess(),
                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    
        {
            ErrorHandler("OpenProcessToken failed.");
        }
    
        // Get the LUID for shutdown privilege.
    
        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
                &tkp.Privileges[0].Luid);
    
        tkp.PrivilegeCount = 1;  // one privilege to set    
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
        // Get shutdown privilege for this process.
    
        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
            (PTOKEN_PRIVILEGES)NULL, 0); 
    
        ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);
        return 0;
    
    }
    

    Das geht ledier auch nicht...

    Keiner mehr eine Idee?



  • falls es nicht unbedingt mit der WinAPI sein muss, könntest du

    system("C:\\WINDOWS\\System32\\shutdown.exe -s -f -t 0 ");
    

    verwenden.



  • Wie bereits ganz oben vermerkt funktioniert das ledier auch nicht 😢



  • KomischerFehler schrieb:

    #include <windows.h>
    #include <iostream>
    
    int main()
    {
    
    	ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);
    	return 0;
    
    }
    

    Das Programm geht mit dem Rückgabewert 0 aus aber der Pc bleibt an.

    Nun ja, du zwnigst dein Programm ja förmlich dazu dir nur eine Erfolgsmeldung zu liefern. Es kann dir ja gar nicht das Fehlschlagen berichten.

    Unter XP und höher muss man für den Prozess erst das Privileg zum Runterfahren des Systems aktivieren. Dashast du ja anscheinend mittlerweile auch schon herausgefunden. Aber anstatt eigen fehlermeldungen auszugeben, solltest du dir mal die fehlermeldungen vom System ausgeben lassen mit GetLastError und FormatMessage, damit du mal siehst WARUM die betreffende Funktion fehlgeschlagen ist.
    Desweitern, warum debuggst du den Cod enicht und guckst, an welcher Stelle er aussteigt? Diese Information wäre auch nicht ganz uninteressant, wenn man dir helfen soll.



  • Du hast keine Admin.Rechte bzw. das Privileg ist nicht freigeschaltet... schau einfach in die Doku und in das dortige Beispiel...



  • Selbst bei einem Administrator müsste das Privileg erst aktiviert werden, wenn ich mich nicht irre.



  • @Luckie: Habe ich alles gemacht. Habe das nur der übersichtlichkeit wegen hier rausgeschrieben.GetLastError lieferte aber leider auch ncihts wirklich wichtiges.

    Mittlerweile funktioniert die Nicht-WinAPI Methode(system(...)].
    Hatte da versehntlich einen Strich in die falsche Richtung... *Gegen Kopf Schlag*
    Mit WinAPI wills immernoch nicht... ABer das ist eigentlich cniht so schlimm. Danke an alle für die Hilfe



  • KomischerFehler schrieb:

    GetLastError lieferte aber leider auch ncihts wirklich wichtiges.

    Solange der Fehler nicht wichtig ist, ist ja gut 👍


Anmelden zum Antworten