Как завершить сеанс работы или перезагрузить Windows NT
Для этого нам потребуются определённые привелегии:
function SetPrivilege(aPrivilegeName: string;
aEnabled: boolean): boolean;
var
TPPrev,
TP: TTokenPrivileges;
Token: THandle;
dwRetLen: DWord;
begin
Result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, @Token);
TP.PrivilegeCount := 1;
if (LookupPrivilegeValue(nil, PChar(aPrivilegeName),
TP.Privileges[0].LUID)) thenbeginif (aEnabled) then
TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
TP.Privileges[0].Attributes := 0;
dwRetLen := 0;
Result := AdjustTokenPrivileges(Token, False, TP,
SizeOf(TPPrev),
TPPrev, dwRetLen);
end;
CloseHandle(Token);
end;
function WinExit(iFlags: integer): boolean;
// возможные флаги:// EWX_LOGOFF// EWX_REBOOT// EWX_SHUTDOWNbegin
Result := True;
if (SetPrivilege('SeShutdownPrivilege', true)) thenbeginif (not ExitWindowsEx(iFlags, 0)) thenbegin
Result := False;
end;
SetPrivilege('SeShutdownPrivilege', False)
endelsebegin
Result := False;
end;
end;
Статья Как завершить сеанс работы или перезагрузить Windows NT раздела ОС и Железо Windows может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.