У меня не получается перезагрузить компьютер спомощью ExitWindowsEx. Пишу ExitWindowsEx(EWX_REBOOT or ewx_force,0);
но система не перзагружается, а завершается сеансработы пользователя. Используется Windows XP или 2000.
Какие есть ещё способы перезагрузки компьютера?
Перезагрузка компьютера
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
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
т.е. чтобы перезагрузить комп ты должен запросить права SE_SHUTDOWN_NAME с помощью AdjustTokenPrivileges
С уважением, Lost Angel...
Viktor Zull, Под Win98 это должно работать.
Под NT/2000, как уже заметил LAngel, нужно запросить себе некие права/привилегии.
Вот пример на C, который мне когда-то давали. Должен работать. Хотя у самого запустить это дело руки не дошли (на и компа с Win2000 тогда не было под рукой)
Под 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 ;
}
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
Да этот пример работает, спасибо. Я хотел перевести его на Delphi, все бы хорошо вот только Delphi не понимает параметра SE_SHUTDOWN_NAME, а всё остальное понимает. Модуль Windows подключен. В чём дело?
В Микрософт C++ в Winnt.h SE_SHUTDOWN_NAME определена как:Viktor Zull писал(а):Да этот пример работает, спасибо. Я хотел перевести его на Delphi, все бы хорошо вот только Delphi не понимает параметра SE_SHUTDOWN_NAME, а всё остальное понимает. Модуль Windows подключен. В чём дело?
Код: Выделить всё
#define SE_SHUTDOWN_NAME TEXT(]
А 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
Если Дельфийский компилятор "нашел" функцию LookupPrivilegeValue, то найди ее дельфийское описание посмотри, как описан этот параметр (lpName) и объяви строковую константу такого же типа со значением "SeShutdownPrivilege". Думаю, это должно сработать.
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
Благодарю за ответ. Теперь работает.