Delphi - база знаний


Как завершить сеанс работы или перезагрузить Windows NT?


Как завершить сеанс работы или перезагрузить 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 
    ifnot ExitWindowsEx( iFlags, 0 ) )then 
    begin 
      Result := False; 
    end
    SetPrivilege( 'SeShutdownPrivilege', False ) 
  end 
  else 
  begin 
    Result := False; 
  end
end;

  Взято с Исходников.ru



Начало  Назад  Вперед