Shutdown reboot logoff Windows 98/ME/XP

{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. } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值