Есть много разных способов выключить компьютер. Рассмотрим несколько из них.
Первый вариант самый простой и более распространён:
ExitWindowsEx(EWX_SHUTDOWN, 0);
Второй способ менее распространён, но так же работоспособный:
WinExec("shutdown -s -t 0", SW_HIDE);
Более сложный с передачей привилегий, если варианты выше не работают:
HANDLE hToken;
TOKEN_PRIVILEGES* NewState;
// Здесь открываем процесс программы с получением ее структуры привилегий
OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES, &hToken);
// Выделяем виртуальную память для структуры
NewState = (TOKEN_PRIVILEGES*) malloc (sizeof (TOKEN_PRIVILEGES) + sizeof (LUID_AND_ATTRIBUTES));
// Количество привилегий которые хотим получить
NewState->PrivilegeCount = 1;
// Здесь получаем UID привилегия на выполнение выключение
LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, &NewState->Privileges[0].Luid);
// Устанавливаем атрибут доступа к привилегий
NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Собственно навязываем привилегию на процесс
AdjustTokenPrivileges (hToken, FALSE, NewState, NULL, NULL, NULL);
// Освобождаем память которую выделили
free (NewState);
CloseHandle (hToken);
// И вот сама функция выключения
ExitWindowsEx(EWX_LOGOFF, 0);