Windows NT 4.0 Shutdown



  • Der Shutdown bei Win95/98/ME ist kein Problem : ExitWindowsEx(EWX_SHUTDOWN, NULL);

    Aber wie funzt das bloß bei NT 4.0 ??

    Vielleicht kann jemand helfen ?



  • Unter NT muss der Prozess, der den Shutdown durchführen will, das Privileg SE_SHUTDOWN_NAME haben, welches man mit AdjustTokenPrivileges setzen kann.

    ------------------
    Gruß Peter

    Wenn Dein Programm auf Anhieb läuft, hast Du irgendwas falsch gemacht 😉
    Ausserdem, ein Blick in die Online-Doku und ein wenig Kreativität wirken manchmal Wunder.



  • Das habe ich auch aus der Online Hilfe, aber ich habe keine Ahnung, wie das laufen soll, weil es sehr spärlich beschrieben ist. Hat jemand einen Beispielcode für mich, der einfach den NT Rechner runterfährt, und ausschaltet ? Es ist ein Server, wo ich im Bios eingestellt habe, er soll morgens um 7 hochfahren. Jetzt soll er Abends um 8 von alleine runterfahren. Vorher war es ein 98 Server, und mein Programm lief wunderbar. Jetzt nach der Umstellung auf NT klappt das leider nicht mehr.



  • Shutdown mit Ausschalten des Rechner geht für NT so:

    void __fastcall TForm1::BShutdownNTClick(TObject *Sender)
    {
        HANDLE token;
        TOKEN_PRIVILEGES tokenpriv;
    
        // Token für diesen Prozess holen
        if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)==0)
        {   
            ShowMessage("Fehler beim OpenProcessToken");
            return;
        }
    
        // LUID für die Shutdown Privilege holen
        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tokenpriv.Privileges[0].Luid);
        tokenpriv.PrivilegeCount=1;
        tokenpriv.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    
        // Shutdown privilege für diesen Prozess setzen
        if(AdjustTokenPrivileges(token, false, &tokenpriv, 0, (PTOKEN_PRIVILEGES)NULL, 0)==NULL)
        {   
            ShowMessage("Fehler bei AdjustTokenPrivileges");
            return;
        }
    
        // Windows beenden und Rechner ausschalten
        if(ExitWindowsEx(EWX_LOGOFF | EWX_POWEROFF, NULL)==NULL)
        {   
            ShowMessage("Fehler beim ExitWindowsEx");
            return;
        }
    }
    

    Der Beispielcode war für den C++-Builder - ShowMessage unter WinApi oder MFC entsprechend ersetzen!

    [ 09.07.2001: Beitrag editiert von: Marc++us ]


Anmelden zum Antworten