Lyn's Tip
==for Delphi
ShutDown(dwTimeOut : DWord = 0; bForceClose : Boolean = true; bReboot : Boolean = false) ;
var
PreviosPrivileges: ^TTokenPrivileges;
TokenPrivileges: TTokenPrivileges;
hToken: THandle;
tmpReturnLength: DWord;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then begin
LookupPrivilegeValue(Nil, 'SeShutdownPrivilege', TokenPrivileges.Privileges[0].Luid);
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tmpReturnLength := 0;
PreviosPrivileges := nil;
AdjustTokenPrivileges(hToken, False, TokenPrivileges, 0, PreviosPrivileges^, tmpReturnLength);
if InitiateSystemShutdown(Nil, Nil, dwTimeOut, bForceClose, bReboot) then begin
TokenPrivileges.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, False, TokenPrivileges, 0, PreviosPrivileges^, tmpReturnLength);
end ;
end ;
end
else
ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0);
end ;
==for C++
void ShutDown( DWORD dwTimeOut /*= 0*/,bool bForceClose /*= true*/, bool bReboot /*= false*/ )
{
_TOKEN_PRIVILEGES* PreviosPrivileges;
_TOKEN_PRIVILEGES TokenPrivileges;
HANDLE hToken;
DWORD tmpReturnLength;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES || TOKEN_QUERY, &hToken))
{
LookupPrivilegeValueA(NULL, "SeShutdownPrivilege", &(TokenPrivileges.Privileges[0].Luid));
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tmpReturnLength = 0;
PreviosPrivileges = NULL;
AdjustTokenPrivileges(hToken, false, &TokenPrivileges, 0, PreviosPrivileges, &tmpReturnLength);
if (InitiateSystemShutdownA(NULL, NULL, dwTimeOut, bForceClose, bReboot))
{
TokenPrivileges.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, false, &TokenPrivileges, 0, PreviosPrivileges, &tmpReturnLength);
}
}
else
{
ExitWindowsEx(EWX_FORCE || EWX_SHUTDOWN || EWX_POWEROFF, 0);
}
}
