Для этого нам потребуются определённые привелегии:

Code:

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;

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!