Wie kann man den Computer herunterfahren lassen (SHUTDOWN)?

Hierfür ist der Systemaufruf ExitWindowsEx vorgesehen. Hier können folgende Parameter vorgegeben werden:

bool ExitWindowsEx(UNIT flags, DWORD res);

Die Werte zum Parameter flags können mit der Pipe | kombiniert werden:

EWX_FORCE Fährt das System ohne die Messages WM_QUERYENDSESSION und WM_ENDSESSION zu versenden herunter
EWX_LOGOFF Alle Prozesse werden heruntergefahren und der User ausgeloggt
EWX_POWEROFF Fährt das System herunter und schaltet die Stromversorgung ab
EWX_REBOOT Fährt das System herunter und bootet neu
EWX_SHUTDOWN Fährt das System herunter nachdem alle Buffer geflusht wurden.

Der Parameter res ist reserviert und wird nicht ausgewertet.

Beispiel:

DWORD res=0;
ExitWindowsEx(EWX_FORCE|EWX_SHUTDOWN,res);

Unter Windows XP sind für diesen Vorgang allerdings Rechte vonnöten. Das Programm benötigt das Recht, den Rechner herunterfahren zu lassen.

Das Recht wird so programmiert:

HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken);
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,false,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);

Zur Übersicht