I use the following code to shutdown either NT or 95
procedure TtvAPIThing.ShutDown;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this
declaration
var
hToken : THandle;
tkp : TTokenPrivileges;
tkpo : TTokenPrivileges;
zero : DWORD;
begin
if Pos( 'Windows NT', OSVersion ) = 1 then
begin
zero := 0;
if not OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed',
MB_OK );
Exit;
end;
if not OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed',
MB_OK );
Exit;
end;
// SE_SHUTDOWN_NAME
if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' ,
tkp.Privileges[ 0 ].Luid ) then
begin
MessageBox( 0, 'Exit Error', 'LookupPrivilegeValue() Failed',
MB_OK );
Exit;
end;
tkp.PrivilegeCount := 1;
tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, False, tkp,
SizeOf(TTokenPrivileges ), tkpo, zero );
if Boolean( GetLastError() ) then
begin
MessageBox(0, 'Exit Error', 'AdjustTokenPrivileges() Failed',
MB_OK );
Exit;
end
else
ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
end // if OSVersion = 'Windows NT'
else
begin // just shut the machine down
ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
end;
end;
--
Tim Victor
tvictor@dolphin.upenn.edu
Policy Research, Evaluation, and Measurement
Graduate School of Education
University of Pennsylvania
               (
geocities.com/huanlin_tsai)