首页  编辑  

调整关机权限

Tags: /超级猛料/OS.操作系统/权限控制/   Date Created:

procedure shut(system, nachricht: string; force, reboot: Boolean; countdown: Integer);

procedure abortshut(system: string);

implementation

const

 SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

var

 hdlg: DWORD = 0;

procedure shut(system, nachricht: string; force, reboot: Boolean; countdown: Integer);

var

 otoken, hToken: THandle;

 tp: TTokenPrivileges;

 h: DWORD;

begin

 OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);

 otoken := htoken;

 LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tp.Privileges[0].luid);

 tp.privilegecount := 1;

 tp.privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

 h := 0;

 AdjustTokenPrivileges(hToken, False, tp, 0, PTokenPrivileges(nil)^, h);

 InitiateSystemShutdown(PChar(system), PChar(nachricht), countdown, force, reboot);

 tp.privilegecount := 1;

 tp.privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

 h := 0;

 AdjustTokenPrivileges(oToken, False, tp, 0, PTokenPrivileges(nil)^, h);

 CloseHandle(hToken);

end;

procedure abortshut(system: string);

var

 hToken: THandle;

 tp: TTokenPrivileges;

 h: DWORD;

begin

 OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);

 LookupPrivilegeValue(PChar(system), SE_SHUTDOWN_NAME, tp.Privileges[0].luid);

 tp.privilegecount := 1;

 tp.privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

 h := 0;

 AdjustTokenPrivileges(hToken, False, tp, 0, PTokenPrivileges(nil)^, h);

 CloseHandle(hToken);

 abortSystemShutdown(PChar(system));

end;

---------------------------------------

procedure TForm1.AdjustToken();

var

 hdlProcessHandle : Cardinal;

 hdlTokenHandle : Cardinal;

 tmpLuid : Int64;

 tkpPrivilegeCount : Int64;

 tkp : TOKEN_PRIVILEGES;

 tkpNewButIgnored : TOKEN_PRIVILEGES;

 lBufferNeeded : Cardinal;

 Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;

begin

       hdlProcessHandle := GetCurrentProcess;

       OpenProcessToken(hdlProcessHandle,

                       (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),

                         hdlTokenHandle);

       // Get the LUID for shutdown privilege.

       LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);

       Privilege[0].Luid := tmpLuid;

       Privil

ege[0].Attributes := SE_PRIVILEGE_ENABLED;

       tkp.PrivilegeCount := 1;  // One privilege to set

       tkp.Privileges[0] := Privilege[0];

       // Enable the shutdown privilege in the access token of this

       // process.

       AdjustTokenPrivileges(hdlTokenHandle,

                             False,

                             tkp,

                             Sizeof(tkpNewButIgnored),

                             tkpNewButIgnored,

                             lBufferNeeded);

end;

******************

在Windows2000下关闭计算机

function ShutDownSystem():BOOL;

var

 hProcess,hAccessToken:THandle;

 LUID_AND_ATTRIBUTES:TLUIDAndAttributes;

 TOKEN_PRIVILEGES: TTokenPrivileges;

 BufferIsNull:DWORD;

Const

 SE_SHUTDOWN_NAME='SeShutdownPrivilege';

begin

 hProcess:=GetCurrentProcess();

OpenProcessToken(hprocess,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,hAccessToken);

 LookupPrivilegeValue(Nil,SE_SHUTDOWN_NAME,LUID_AND_ATTRIBUTES.Luid);

 LUID_AND_ATTRIBUTES.Attributes:=SE_PRIVILEGE_ENABLED;

 TOKEN_PRIVILEGES.PrivilegeCount:=1;

 TOKEN_PRIVILEGES.Privileges[0]:=LUID_AND_ATTRIBUTES;

 BufferIsNull:=0;

AdjustTokenPrivileges(hAccessToken,False,TOKEN_PRIVILEGES,sizeof(TOKEN_PRIVI

LEGES),Nil,BufferIsNull);

 ExitWindowsEx(EWX_REBOOT, 0);

ShutDownSystem:=True;

end;