shutdown / reboot / logoff Windows 9x/NT/Me/2000/XP?

Author: NeuralAbyss Software 

Homepage: http://www.neuralabyss.com

 

 

{1.}

 

function MyExitWindows(RebootParam: Longword): Boolean;

var

  TTokenHd: THandle;

  TTokenPvg: TTokenPrivileges;

  cbtpPrevious: DWORD;

  rTTokenPvg: TTokenPrivileges;

  pcbtpPreviousRequired: DWORD;

  tpResult: Boolean;

const

  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

begin

  if Win32Platform = VER_PLATFORM_WIN32_NT then

  begin

    tpResult := OpenProcessToken(GetCurrentProcess(),

      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,

      TTokenHd);

    if tpResult then

    begin

      tpResult := LookupPrivilegeValue(nil,

                                       SE_SHUTDOWN_NAME,

                                       TTokenPvg.Privileges[0].Luid);

      TTokenPvg.PrivilegeCount := 1;

      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

      cbtpPrevious := SizeOf(rTTokenPvg);

      pcbtpPreviousRequired := 0;

      if tpResult then

        Windows.AdjustTokenPrivileges(TTokenHd,

                                      False,

                                      TTokenPvg,

                                      cbtpPrevious,

                                      rTTokenPvg,

                                      pcbtpPreviousRequired);

    end;

  end;

  Result := ExitWindowsEx(RebootParam, 0);

end;

 

// Example to shutdown Windows:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  MyExitWindows(EWX_POWEROFF or EWX_FORCE);

end;

 

// Example to reboot Windows:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  MyExitWindows(EWX_REBOOT or EWX_FORCE);

end;

 

 

// Parameters for MyExitWindows()

 

 

{************************************************************************}

 

{2. Console Shutdown Demo}

 

program Shutdown;

{$APPTYPE CONSOLE}

 

uses

  SysUtils,

  Windows;

 

// Shutdown Program

// (c) 2000 NeuralAbyss Software

// www.neuralabyss.com

 

var

  logoff: Boolean = False;

  reboot: Boolean = False;

  warn: Boolean = False;

  downQuick: Boolean = False;

  cancelShutdown: Boolean = False;

  powerOff: Boolean = False;

  timeDelay: Integer = 0;

 

function HasParam(Opt: Char): Boolean;

var

  x: Integer;

begin

  Result := False;

  for x := 1 to ParamCount do

    if (ParamStr(x) = '-' + opt) or (ParamStr(x) = '/' + opt) then Result := True;

end;

 

function GetErrorstring: string;

var

  lz: Cardinal;

  err: array[0..512] of Char;

begin

  lz := GetLastError;

  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @err, 512, nil);

  Result := string(err);

end;

 

procedure DoShutdown;

var

  rl, flgs: Cardinal;

  hToken: Cardinal;

  tkp: TOKEN_PRIVILEGES;

begin

  flgs := 0;

  if downQuick then flgs := flgs or EWX_FORCE;

  if not reboot then flgs := flgs or EWX_SHUTDOWN;

  if reboot then flgs := flgs or EWX_REBOOT;

  if poweroff and (not reboot) then flgs := flgs or EWX_POWEROFF;

  if logoff then flgs := (flgs and (not (EWX_REBOOT or EWX_SHUTDOWN or EWX_POWEROFF))) or

      EWX_LOGOFF;

  if Win32Platform = VER_PLATFORM_WIN32_NT then

  begin

    if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,

      hToken) then

      Writeln('Cannot open process token. [' + GetErrorstring + ']')

    else

    begin

      if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then

      begin

        tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

        tkp.PrivilegeCount           := 1;

        AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);

        if GetLastError <> ERROR_SUCCESS then

          Writeln('Error adjusting process privileges.');

      end

      else

        Writeln('Cannot find privilege value. [' + GetErrorstring + ']');

    end;

    {   if CancelShutdown then

          if AbortSystemShutdown(nil) = False then

            Writeln(\'Cannot abort. [\' + GetErrorstring + \']\')

          else

           Writeln(\'Cancelled.\')

       else

       begin

         if InitiateSystemShutdown(nil, nil, timeDelay, downQuick, Reboot) = False then

            Writeln(\'Cannot go down. [\' + GetErrorstring + \']\')

         else

            Writeln(\'Shutting down!\');

       end;

    }

  end;

  //     else begin

  ExitWindowsEx(flgs, 0);

  //     end;

end;

 

begin

  Writeln('Shutdown v0.3 for Win32 (similar to the Linux version)');

  Writeln('(c) 2000 NeuralAbyss Software. All Rights Reserved.');

  if HasParam('?') or (ParamCount = 0) then

  begin

    Writeln('Usage:    shutdown [-akrhfnc] [-t secs]');

    Writeln('                  -k:      don''t really shutdown, only warn.');

    Writeln('                  -r:      reboot after shutdown.');

    Writeln('                  -h:      halt after shutdown.');

    Writeln('                  -p:      power off after shutdown');

    Writeln('                  -l:      log off only');

    Writeln('                  -n:      kill apps that don''t want to die.');

    Writeln('                  -c:      cancel a running shutdown.');

  end

  else

  begin

    if HasParam('k') then warn := True;

    if HasParam('r') then reboot := True;

    if HasParam('h') and reboot then

    begin

      Writeln('Error: Cannot specify -r and -h parameters together!');

      Exit;

    end;

    if HasParam('h') then reboot := False;

    if HasParam('n') then downQuick := True;

    if HasParam('c') then cancelShutdown := True;

    if HasParam('p') then powerOff := True;

    if HasParam('l') then logoff := True;

    DoShutdown;

  end;

end.

 

 

 

 

  

// Parameters for MyExitWindows()

 

 

EWX_LOGOFF

 

Shuts down all processes running in the security context of the process that called the

ExitWindowsEx function. Then it logs the user off.

 

Alle Prozesse des Benutzers werden beendet, danach wird der Benutzer abgemeldet.

 

EWX_POWEROFF

 

Shuts down the system and turns off the power.

The system must support the power-off feature.

Windows NT/2000/XP:

The calling process must have the SE_SHUTDOWN_NAME privilege.

 

Fährt Windows herunter und setzt den Computer in den StandBy-Modus,

sofern von der Hardware unterstützt.

 

EWX_REBOOT

 

Shuts down the system and then restarts the system.

Windows NT/2000/XP: The calling process must have the SE_SHUTDOWN_NAME privilege.

 

Fährt Windows herunter und startet es neu.

 

EWX_SHUTDOWN

 

Shuts down the system to a point at which it is safe to turn off the power.

All file buffers have been flushed to disk, and all running processes have stopped.

If the system supports the power-off feature, the power is also turned off.

Windows NT/2000/XP: The calling process must have the SE_SHUTDOWN_NAME privilege.

 

Fährt Windows herunter.

 

 

EWX_FORCE

 

Forces processes to terminate. When this flag is set,

the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages.

This can cause the applications to lose data.

Therefore, you should only use this flag in an emergency.

 

Die aktiven Prozesse werden zwangsweise und ohne Rückfrage beendet.

 

EWX_FORCEIFHUNG

 

Windows 2000/XP: Forces processes to terminate if they do not respond to the

WM_QUERYENDSESSION or WM_ENDSESSION message. This flag is ignored if EWX_FORCE is used.

 

Windows 2000/XP: Die aktiven Prozesse werden aufgefordert, sich selbst zu beenden und

müssen dies bestätigen. Reagieren sie nicht, werden sie zwangsweise beendet.

 

 

 

 

 

 

More Links to this topic

http://www.swissdelphicenter.ch/de/showcode.php?id=1232