Den nedenstående procedure kan bruges på alle 32 bits versioner af Windows :
function ExitWIndows( iFlags : integer ) : boolean;
function 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
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;
begin
Result := True;
if( SetPrivilege( \'SeShutdownPrivilege\', True ) )then
begin
if( not ExitWindowsEx( iFlags, 0 ) )then
begin
// handle errors...
Result := False;
end;
SetPrivilege( \'SeShutdownPrivilege\', False )
end
else
begin
// handle errors...
Result := False;
end;
end;
kan fx. kaldes således :
ExitWIndows( EWX_SHUTDOWN ); // for at lukke ned
ExitWIndows( EWX_REBOOT ); // for at genstarte
eksemplet er taget fra
http://borrisholt.comJens B