Todo depende, que windows??? 95/98/me o nt/2000/xp, ya que el primer grupo se apaga de una forma y el segundo de otra...
bool apagarWindows(void)
{
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx( &osvi );
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
//--- Si estamos en NT/2000/XP obtenemos el permiso necesario del sistema
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false;
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);
if (GetLastError() != ERROR_SUCCESS)
return false;
}
//--- Apagamos
if (!ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
return false;
return true;
}
Eso lo hace en ambos sistemas...
Saludos