C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ShutDown, Как выключть винду
Chemangel
Отправлено: 17.12.2003, 16:02


Не зарегистрирован







Как реализовать выключение Win2000 (ShutDown) через API если есть альтернативный способ подскажите.
Admin
Отправлено: 17.12.2003, 19:06


Владимир

Группа: Администратор
Сообщений: 1190



CODE

// получаем привелегию SE_SHUTDOWN_NAME
if(GetPrivileges("SeShutdownPrivilege")) // завершаем работу
  ExitWindowsEx (EWX_SHUTDOWN|EWX_POWEROFF , NULL);
// или перезагрузка — ExitWindowsEx (EWX_REBOOT, NULL);

//-----------------------------------
bool __fastcall TFMain::GetPrivileges(AnsiString sp)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;

// Operation System version  - OS Version
bool isOSNT; // Система NT  ?
OSVERSIONINFO OSver;
   OSver.dwOSVersionInfoSize = sizeof(OSver);
   GetVersionEx(&OSver);
   if(OSver.dwPlatformId != VER_PLATFORM_WIN32_NT)
        isOSNT = false; else isOSNT = true;

  // если не NT — привелегия не нужна
  if(!isOSNT) return true;

// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
       TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
   ShowMessage("OpenProcessToken");
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, sp.c_str(), &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;  // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
bool rv = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
                                 (PTOKEN_PRIVILEGES)NULL, 0);
// Cannot test the return value of AdjustTokenPrivileges.
CloseHandle (hToken);
if(rv || (GetLastError() == ERROR_SUCCESS)) return true;
                                      else return false;
}


Вернуться в Вопросы программирования в C++Builder