Как завершить сеанс работы или перезагрузить Windows NT?
Материал из DRKB
Как завершить сеанс работы или перезагрузить 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) then
begin
if 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_SHUTDOWN
begin
Result := True;
if SetPrivilege('SeShutdownPrivilege', True) then
begin
if (not ExitWindowsEx(iFlags, 0)) then
begin
Result := False;
end;
SetPrivilege('SeShutdownPrivilege', False);
end
else
begin
Result := False;
end;
end;
Source: Взято из http://forum.sources.ru
ID: 01669