procedure TForm1.Button2Click(Sender: TObject); var VerInfo:TOSVersionInfo; hToken:THANDLE; tkp:TOKEN_PRIVILEGES; Nothing:Cardinal; begin VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo); GetVersionEx(VerInfo); if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then Begin OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken); LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid); tkp.PrivilegeCount:= 1; tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing); End; ExitWindowsEx(EWX_POWEROFF,0);//关机 end; 试试这个............
var hToken:THANDLE; tkp:TTokenPrivileges; Rl:Dword; begin if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then begin LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid); tkp.PrivilegeCount:= 1; tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken,FALSE,tkp,SizeOf(tkp),tkp,Rl); ExitWindowsEx(EWX_SHUTDOWN, 0); //关机 end; end;
procedure TForm1.Button2Click(Sender: TObject);
var
VerInfo:TOSVersionInfo;
hToken:THANDLE;
tkp:TOKEN_PRIVILEGES;
Nothing:Cardinal;
begin
VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);
GetVersionEx(VerInfo);
if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
Begin
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing);
End;
ExitWindowsEx(EWX_POWEROFF,0);//关机
end;
试试这个............
hToken:THANDLE;
tkp:TTokenPrivileges;
Rl:Dword;
begin
if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
begin
LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,tkp,SizeOf(tkp),tkp,Rl);
ExitWindowsEx(EWX_SHUTDOWN, 0); //关机
end;
end;
另外,ExitWindowsEx的第2参数最好不要给0,参考MSDN中的说明。
function Irc_Reboot_Shutdown(i:integer):boolean;
var
hToken :THandle;
tkp : TOKEN_PRIVILEGES;
ReturnLength : DWord;
begin
RESULT:=false;
if (not OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES
or TOKEN_ALL_ACCESS
or TOKEN_QUERY, hToken))
then
RESULT:=false;
LookupPrivilegevalue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED;
ReturnLength :=0;
AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,ReturnLength);if (GetLastError() <> ERROR_SUCCESS) then
RESULT:=false;
case i of
1: begin
ExitWindowsEx(EWX_REBOOT, 0); //reboot
RESULT:=true;
end;
2: begin
ExitWindowsEx(EWX_SHUTDOWN+EWX_POWEROFF, 0); //shutdown //关闭计算机
RESULT:=true;
end;
3: begin
ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN, 0); //force shutdown
RESULT:=true;
end;
4: begin
ExitWindowsEx(EWX_LOGOFF, 0); //logoff
RESULT:=true;
end;
end;
end;
2,编译时不报错,直接就是不运行程序。。并不是运行了不能关机。