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