1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
   | Function ArreterPC: Boolean;
Var
  Token: THandle;
  TokenPrivilege: TTokenPrivileges;
  Outlen: Cardinal;
  Error: Dword;
 
Const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
 
Begin
  Result:=False;
 
// Récupère les informations de sécurité pour ce process.
  if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, Token)
    then Exit;
 
  try
    FillChar(TokenPrivilege, SizeOf(TokenPrivilege),0);
      // Valeur de retour
    Outlen := 0;
      // Un seul privilége à positionner
    TokenPrivilege.PrivilegeCount := 1;
      // Récupère le LUID pour le privilége 'shutdown'.
      // un Locally Unique IDentifier est une valeur générée unique jusqu'a ce
      // que le système soit redémarré
    LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, TokenPrivilege.Privileges[0].Luid);
      // Positionne le privilége shutdown pour ce process.
    TokenPrivilege.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(Token, False, TokenPrivilege, SizeOf(TokenPrivilege),nil, OutLen);
    Error:=GetLastError;
    If Error <> ERROR_SUCCESS
      then Exit;
 
      // Arrête le système
      //Pour terminer la session en cours : EWX_LOGOFF
      //Pour arrêter Windows ( n'arrête pas l'alimentation ) : EWX_SHUTDOWN
      //Pour arrêter Windows et l'alimentation : EWX_POWEROFF
      //Pour redémarrer Windows : EWX_REBOOT
      //Pour forcer la fin des process avant le redémarrage de Windows : EWX_SHUTDOWN + EWX_FORCE
      //Pour forcer l'arrêt des applications et le PC* : EWX_SHUTDOWN + EWX_FORCEIFHUNG
 
    if ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE, 0) = False    // Areter malgre Delphi ouvert
      then Exit;
 
    Result:=True;
 
  finally
 
    CloseHandle(Token);
  end;
end; | 
Partager