Вот рабочий код для Windows
C++ (Qt)
DWORD rebootWin()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
DWORD dwRetVal;
// Получаем маркер (token) для этого процесса.
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return (GetLastError());
// Получаем LUID для привилегии выключения (shutdown).
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Получаем привилегию выключения (shutdown) для этого процесса.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
if ((dwRetVal = GetLastError()) != ERROR_SUCCESS) return dwRetVal;
// Выключаем или перезагружаем в соответствие с ExitFlags
if (!ExitWindowsEx(EWX_LOGOFF|EWX_REBOOT, 0)) return (GetLastError());
}