Bonjour,
J'ai fait la même recherche il y a peu et j'ai trouve ceci :
http://delphi.developpez.com/faq/?page=systemedivers#StopRunWindows
et en faisant une très légère modification pour l'utiliser comme je voulais
Function ArretSystem(uFlags: UINT): 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
if ExitWindowsEx(uFlags, 0)=False
then Exit;
Result:=True;
finally
CloseHandle(Token);
end;
end;
après :
éteint le PC
ArretSystem(EWX_SHUTDOWN + EWX_FORCEIFHUNG);
redémarre le PC
ArretSystem(EWX_REBOOT + EWX_FORCEIFHUNG);
(testé sous XP)
--
2 avril 2014 à 12:18