Учись программированию на C++ Builder бесплатно!

Есть много разных способов выключить компьютер. Рассмотрим несколько из них.

Первый вариант самый простой и более распространён:

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);

Поиск по сайту