Владимир
Группа: Администратор
Сообщений: 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;
}
|
|