Procedure ExitWindows(Flags: Integer); var Handle : THandle; TokenPrivileges : TTokenPrivileges; Size : Cardinal; Begin If not(OpenProcessToken(GetCurrentProcess,TOKEN_WRITE,Handle)) Then RaiseLastOSError; If not(LookupPrivilegeValue(nil, 'SeShutdownPrivilege', TokenPrivileges.Privileges[0].Luid)) Then RaiseLastOSError; TokenPrivileges.PrivilegeCount := 1; TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; If not(AdjustTokenPrivileges(Handle,False,TokenPrivileges,0,nil,Size)) Then RaiseLastOSError; If not(ExitWindowsEx(Flags,0)) Then RaiseLastOSError; End; ExitWindows(EWX_POWEROFF or EWX_SHUTDOWN); //关机 ExitWindows(EWX_REBOOT or EWX_FORCE); //重起定时用timer
下面是伪代码,需要使用TTimerprocedure Timer1Timer (Sender: TObject) begin GetLocalTime (&t); if (t.Hour=HourOf(Now)) and (t.Minute=MinuteOf(Now)) and (t.Second=SecondOf(Now)) then begin // 如果是winnt系统,在这里adjust token privillege ExitWindowsEx (...//这里是参数,使用什么参数请参考MSDN); end; end;
//--重启动 if Win32Platform <> VER_PLATFORM_WIN32_NT then //不是NT ExitWindowsEx(EWX_REBOOT, 0) else begin SetPrivilege('SeShutdownPrivilege', True); if not ExitWindowsEx(EWX_REBOOT + EWX_FORCE, 0) then SetPrivilege('SeShutdownPrivilege', False); end; //--关机 if Win32Platform <> VER_PLATFORM_WIN32_NT then //不是NT ShellExecute(handle, 'open', 'RUNDLL32.EXE', 'user.exe,ExitWindows', nil, SW_ShowNormal) else begin SetPrivilege('SeShutdownPrivilege', True); if not ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE, 0) then SetPrivilege('SeShutdownPrivilege', False); end;
var
Handle : THandle;
TokenPrivileges : TTokenPrivileges;
Size : Cardinal;
Begin
If not(OpenProcessToken(GetCurrentProcess,TOKEN_WRITE,Handle)) Then
RaiseLastOSError;
If not(LookupPrivilegeValue(nil, 'SeShutdownPrivilege', TokenPrivileges.Privileges[0].Luid)) Then
RaiseLastOSError;
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
If not(AdjustTokenPrivileges(Handle,False,TokenPrivileges,0,nil,Size)) Then
RaiseLastOSError;
If not(ExitWindowsEx(Flags,0)) Then
RaiseLastOSError;
End; ExitWindows(EWX_POWEROFF or EWX_SHUTDOWN); //关机
ExitWindows(EWX_REBOOT or EWX_FORCE); //重起定时用timer
begin
GetLocalTime (&t);
if (t.Hour=HourOf(Now)) and (t.Minute=MinuteOf(Now)) and (t.Second=SecondOf(Now)) then begin
// 如果是winnt系统,在这里adjust token privillege
ExitWindowsEx (...//这里是参数,使用什么参数请参考MSDN);
end;
end;
if Win32Platform <> VER_PLATFORM_WIN32_NT then //不是NT
ExitWindowsEx(EWX_REBOOT, 0)
else
begin
SetPrivilege('SeShutdownPrivilege', True);
if not ExitWindowsEx(EWX_REBOOT + EWX_FORCE, 0) then
SetPrivilege('SeShutdownPrivilege', False);
end; //--关机
if Win32Platform <> VER_PLATFORM_WIN32_NT then //不是NT
ShellExecute(handle, 'open', 'RUNDLL32.EXE', 'user.exe,ExitWindows', nil, SW_ShowNormal)
else
begin
SetPrivilege('SeShutdownPrivilege', True);
if not ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE, 0) then
SetPrivilege('SeShutdownPrivilege', False);
end;