type
TForm1 = class(TForm)
Button1: TButton;
function WinExitInNT(iFlags: Integer): Boolean;
function SetPrivilege(sPrivilegeName: string; bEnabled: Boolean): Boolean;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function Tform1.WinExitInNT(iFlags: Integer ): Boolean;
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;
function Tform1.SetPrivilege(sPrivilegeName: string; bEnabled: 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(sPrivilegeName),TP.Privileges[ 0 ].LUID )) then
begin
if(bEnabled) then
begin
TP.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
end else begin
TP.Privileges[ 0 ].Attributes := 0;
end;
dwRetLen := 0;
Result := AdjustTokenPrivileges(Token,False,TP,SizeOf( TPPrev ),TPPrev,dwRetLen);
end;
CloseHandle(Token );
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WinExitInNT(EWX_POWEROFF);
end;