procedure TKStatus.ShutDown; const SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; var hToken:THandle; tkp:TTokenPrivileges; tkpo:TTokenPrivileges; zero:DWORD; begin if Pos('Windows NT',GetWinVersion) = 1 then begin zero := 0; if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then begin Exit; end; if not LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid) then begin Exit; end; tkp.PrivilegeCount := 1; tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken,False,tkp,SizeOf(TTokenPrivileges),tkpo,zero); if Boolean(GetLastError()) then begin Exit; end else ExitWindowsEx(EWX_FORCE or EWX_POWEROFF,0); //ExitWindowsEx(EWX_SHUTDOWN,0); // end else begin ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN,0); //ExitWindowsEx(EWX_SHUTDOWN,0); // end; end;procedure TKStatus.ReBoot; const SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; var hToken:THandle; tkp:TTokenPrivileges; tkpo:TTokenPrivileges; zero:DWORD; begin if Pos('Windows NT',GetWinVersion) = 1 then begin zero := 0; if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then begin Exit; end; if not LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid) then begin Exit; end; tkp.PrivilegeCount := 1; tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken,False,tkp,SizeOf(TTokenPrivileges),tkpo,zero); if Boolean(GetLastError()) then begin Exit; end else ExitWindowsEx(EWX_FORCE or EWX_REBOOT,0); end else begin ExitWindowsEx(EWX_FORCE or EWX_REBOOT,0); end; end;
function GetWinVer: boolean; var Getver: OSVERSIONINFO; RET: LONGBOOL; begin Result := true; Getver.dwOSVersionInfoSize := 148; RET := GETVERSIONEX(Getver); if Getver.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then Result := False; // if Getver.dwPlatformId=VER_PLATFORM_WIN32_NT then end;procedure 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; Privilege[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;function ShutDownWin: boolean; { const EWX_FORCE = 4; //关闭所有程序并以其他用户身份登录 EWX_LOGOFF = 0; //重新启动计算机并切换到MS-DOS方式 EWX_REBOOT = 2; //重新启动计算机 EWX_SHUTDOWN = 1; //关闭计算机 } begin if GetWinVer then AdjustToken; Result := ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0); end;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
var
hToken:THandle;
tkp:TTokenPrivileges;
tkpo:TTokenPrivileges;
zero:DWORD;
begin
if Pos('Windows NT',GetWinVersion) = 1 then
begin
zero := 0;
if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
begin
Exit;
end;
if not LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid) then
begin
Exit;
end;
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,False,tkp,SizeOf(TTokenPrivileges),tkpo,zero);
if Boolean(GetLastError()) then
begin
Exit;
end
else
ExitWindowsEx(EWX_FORCE or EWX_POWEROFF,0); //ExitWindowsEx(EWX_SHUTDOWN,0); //
end
else
begin
ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN,0); //ExitWindowsEx(EWX_SHUTDOWN,0); //
end;
end;procedure TKStatus.ReBoot;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
var
hToken:THandle;
tkp:TTokenPrivileges;
tkpo:TTokenPrivileges;
zero:DWORD;
begin
if Pos('Windows NT',GetWinVersion) = 1 then
begin
zero := 0;
if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
begin
Exit;
end;
if not LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid) then
begin
Exit;
end;
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,False,tkp,SizeOf(TTokenPrivileges),tkpo,zero);
if Boolean(GetLastError()) then
begin
Exit;
end
else
ExitWindowsEx(EWX_FORCE or EWX_REBOOT,0);
end
else
begin
ExitWindowsEx(EWX_FORCE or EWX_REBOOT,0);
end;
end;
var
Getver: OSVERSIONINFO;
RET: LONGBOOL;
begin
Result := true;
Getver.dwOSVersionInfoSize := 148;
RET := GETVERSIONEX(Getver);
if Getver.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then
Result := False;
// if Getver.dwPlatformId=VER_PLATFORM_WIN32_NT then
end;procedure 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;
Privilege[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;function ShutDownWin: boolean;
{
const
EWX_FORCE = 4; //关闭所有程序并以其他用户身份登录
EWX_LOGOFF = 0; //重新启动计算机并切换到MS-DOS方式
EWX_REBOOT = 2; //重新启动计算机
EWX_SHUTDOWN = 1; //关闭计算机
}
begin
if GetWinVer then
AdjustToken;
Result := ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;