Det er korrekt at ExitWindowsEx skal bruges for at lukke Windows ned, men på NT4 / 2000 / XP fungerer det kun hvis processen har rettigheder til nedlukningen. ( Fra MSDN : "To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege.")
Flg. virker på alle Windows versioner.
#include <windows.h>
.....
bool ShutDownSystem(long flag)
{
OSVERSIONINFO vi ;
LUID luid ;
HANDLE hProcess, hToken ;
long ret = -1 ;
DWORD s ;
TOKEN_PRIVILEGES tp, tpOld ;
vi.dwOSVersionInfoSize = sizeof(vi) ;
GetVersionEx(&vi) ;
if ( vi.dwPlatformId == VER_PLATFORM_WIN32_NT )
{
// Der køres NT, og vi skal have lavet rettigheder til at lukke systemet ned
if ( LookupPrivilegeValue(0,SE_SHUTDOWN_NAME,&luid) )
{
hProcess = GetCurrentProcess() ;
if ( hProcess )
{
if ( OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
{
tp.PrivilegeCount = 1 ;
tp.Privileges->Attributes = SE_PRIVILEGE_ENABLED ;
tp.Privileges->Luid.HighPart = luid.HighPart ;
tp.Privileges->Luid.LowPart = luid.LowPart ;
ret = AdjustTokenPrivileges(hToken, FALSE,&tp,sizeof(tp),&tpOld,&s) ;
}
CloseHandle(hToken) ;
}
}
}
if ( ExitWindowsEx(flag,0) )
return true ;
else
return false ;
}