Как выключить компьютер через Windows API? - PullRequest
3 голосов
/ 01 октября 2009

Я никогда запрограммировал winapi, поэтому у меня небольшая проблема здесь.

Мне нужно выключить компьютер из приложения.

Я нашел этот пример текст ссылки Затем я нашел этот пример, как изменить привилегии Текст ссылки

Но у меня проблема, как получить этот параметр HANDLE hToken // дескриптор доступа

Я думаю, мне нужно сделать это в следующем порядке, чтобы получить параметр OpenProcessToken LookupPrivilegeValue AdjustTokenPrivileges но есть много параметров, которые я понятия не имею, что с ними делать.

может быть, у вас есть пример, как я могу получить параметр HANDLE hToken, чтобы это работало.

Кстати, я уже видел следующий пост текст ссылки

Большое спасибо всем вам.

Ответы [ 6 ]

8 голосов
/ 01 октября 2009
// ==========================================================================
// system shutdown
// nSDType: 0 - Shutdown the system
//          1 - Shutdown the system and turn off the power (if supported)
//          2 - Shutdown the system and then restart the system
void SystemShutdown(UINT nSDType)
{
    HANDLE           hToken;
    TOKEN_PRIVILEGES tkp   ;

    ::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);
    ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);

    tkp.PrivilegeCount          = 1                   ; // set 1 privilege
    tkp.Privileges[0].Attributes= SE_PRIVILEGE_ENABLED;

    // get the shutdown privilege for this process
    ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

    switch (nSDType)
    {
        case 0: ::ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE, 0); break;
        case 1: ::ExitWindowsEx(EWX_POWEROFF|EWX_FORCE, 0); break;
        case 2: ::ExitWindowsEx(EWX_REBOOT  |EWX_FORCE, 0); break;
    }
}
5 голосов
/ 01 октября 2009

Вы можете использовать ShellExecute () для вызова shutdown.exe

4 голосов
/ 01 октября 2009

http://msdn.microsoft.com/en-us/library/aa376868(VS.85).aspx

Попробуйте

ExitWindowsEx(EWX_POWEROFF, 0);
3 голосов
/ 01 октября 2009

Это немного для комментариев к ответу Даниэля, поэтому я выложу его здесь.

Похоже, что ваша главная проблема на данный момент заключается в том, что ваш процесс не работает с привилегиями, необходимыми для завершения работы системы.

Документы для ExitWindowsEx содержат следующую строку:

Чтобы выключить или перезапустить систему, вызывающий процесс должен использовать AdjustTokenPrivileges функция для включить привилегию SE_SHUTDOWN_NAME. Для получения дополнительной информации см. Запуск с Специальные привилегии .

У них также есть некоторый пример кода . В крайнем случае, вы можете просто скопировать это.

0 голосов
/ 01 мая 2014

Некоторый рабочий код для InitiateSystemShutdownEx:

// Get the process token
HANDLE hToken;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
    &hToken);

// Build a token privilege request object for shutdown
TOKEN_PRIVILEGES tk;
tk.PrivilegeCount = 1;
tk.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
LookupPrivilegeValue(NULL, TEXT("SeShutdownPrivilege"), &tk.Privileges[0].Luid);

// Adjust privileges
AdjustTokenPrivileges(hToken, FALSE, &tk, 0, NULL, 0);

// Go ahead and shut down
InitiateSystemShutdownEx(NULL, NULL, 0, FALSE, FALSE, 0);

Насколько я могу судить, преимущество по сравнению с ExitWindowsEx решением состоит в том, что вызывающему процессу не обязательно принадлежать активному пользователю.

0 голосов
/ 12 апреля 2014
#include<iostream>
using namespace std;
int main(){
system("shutdown -s -f -t 0");
}
...