Содержание материала

 

Code:

program Shutdown;

{$APPTYPE CONSOLE}

 

uses

SysUtils,

Windows;

 

// Shutdown Program

// (c) 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:      dont 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 dont 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.

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить