Перезагрузка компьютера

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

У меня не получается перезагрузить компьютер спомощью ExitWindowsEx. Пишу ExitWindowsEx(EWX_REBOOT or ewx_force,0);
но система не перзагружается, а завершается сеансработы пользователя. Используется Windows XP или 2000.

Какие есть ещё способы перезагрузки компьютера?
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

MSDN: To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information, see Running with Special Privileges.

т.е. чтобы перезагрузить комп ты должен запросить права SE_SHUTDOWN_NAME с помощью AdjustTokenPrivileges
С уважением, Lost Angel...
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Viktor Zull, Под Win98 это должно работать.
Под NT/2000, как уже заметил LAngel, нужно запросить себе некие права/привилегии.
Вот пример на C, который мне когда-то давали. Должен работать. Хотя у самого запустить это дело руки не дошли (на и компа с Win2000 тогда не было под рукой)

Код: Выделить всё

// //////////////////////////////////////////////////////////////////////////
//
// ShutDown computer procedure
//

void PowerOff()
{
   HANDLE            hToken;
   OSVERSIONINFO     OsVersion;
   TOKEN_PRIVILEGES  Tkp;
   TOKEN_PRIVILEGES  PrevTkp;
   DWORD             dwLength;
   DWORD             dwErrorCode;

   // Check for the NT platyfopm
   OsVersion.dwOSVersionInfoSize = sizeof(OsVersion); 
   GetVersionEx(&OsVersion); 
   if (OsVersion.dwPlatformId == VER_PLATFORM_WIN32_NT) {

      // Enable the SE_SHUTDOWN_NAME periviledge 
      if (!OpenProcessToken(GetCurrentProcess(), 
                            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, 
                            &hToken))
         return ;
      if (!LookupPrivilegeValue(NULL, 
                                SE_SHUTDOWN_NAME, 
                                &Tkp.Privileges[0].Luid))
         return ;
      Tkp.PrivilegeCount = 1; 
      Tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
      AdjustTokenPrivileges(hToken, FALSE, &Tkp, sizeof(PrevTkp), &PrevTkp, &dwLength);
      if ((dwErrorCode = GetLastError()) != ERROR_SUCCESS) 
         return ;
   }

   // Exit windows
   ExitWindowsEx(EWX_POWEROFF | EWX_SHUTDOWN, 0); 
   return ;
}
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

Да этот пример работает, спасибо. Я хотел перевести его на Delphi, все бы хорошо вот только Delphi не понимает параметра SE_SHUTDOWN_NAME, а всё остальное понимает. Модуль Windows подключен. В чём дело?
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Viktor Zull писал(а):Да этот пример работает, спасибо. Я хотел перевести его на Delphi, все бы хорошо вот только Delphi не понимает параметра SE_SHUTDOWN_NAME, а всё остальное понимает. Модуль Windows подключен. В чём дело?
В Микрософт C++ в Winnt.h SE_SHUTDOWN_NAME определена как:

Код: Выделить всё

#define SE_SHUTDOWN_NAME                  TEXT&#40]

А TEXT - это (если я правильно нашел) define:
[code]#ifdef  UNICODE                     // r_winnt
#define __TEXT(quote) L##quote      // r_winnt
#else   /* UNICODE */               // r_winnt
#define __TEXT(quote) quote         // r_winnt
#endif /* UNICODE */                // r_winnt
В общем, получается, что SE_SHUTDOWN_NAME - это обычная Си-шная null-терминированная строка (Собственно, тип параметра функции LookupPrivilegeValue, в который она передается - LPCTSTR)

Если Дельфийский компилятор "нашел" функцию LookupPrivilegeValue, то найди ее дельфийское описание посмотри, как описан этот параметр (lpName) и объяви строковую константу такого же типа со значением "SeShutdownPrivilege". Думаю, это должно сработать.
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

Благодарю за ответ. Теперь работает.
Ответить