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

    Source: geocities.com/huanlin_tsai/faq

               ( geocities.com/huanlin_tsai)