procedure TraceError; // 报告错误消息
var lpMsgBuf: PChar;
var ErrorID: DWORD;
begin
ErrorID := GetLastError;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS,
nil,
ErrorID,
0, // Default language
@lpMsgBuf,
0,
nil
);
ShowMessage(IntToStr(ErrorID) + ':' + String(lpMsgBuf));
LocalFree(Cardinal(lpMsgBuf));
end;
function Prepare(MachineName: PChar): Boolean; // 调整权限
var
App: THANDLE;
Num: DWORD;
Tok: TOKEN_PRIVILEGES;
begin
Result := False;
//ShowMessage('OpenProcessToken...');
if not OpenProcessToken(
GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
App
) then
TraceError
else
begin
Tok.PrivilegeCount := 1;
//ShowMessage('LookupPrivilegeValue...');
if LookupPrivilegeValue(MachineName, 'SeShutdownPrivilege', Tok.Privileges[0].Luid) then
begin
Tok.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
//ShowMessage('AdjustTokenPrivileges...');
if not AdjustTokenPrivileges(App, False, Tok, SizeOf(Tok), Tok, Num) then
TraceError
else
Result := True;
end
else
TraceError;
end;
CloseHandle(App);
end;
function ShutdownWindows: Boolean; // 关机
begin
Result := Prepare(nil) and ExitWindowsEx(EWX_SHUTDOWN, 0);
end;