Выключить или перезагрузить, или завершить сеанс в любой версии Windows

Советы » Компьютер » Выключить или перезагрузить, или завершить сеанс в любой версии Windows

{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

.

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com