为什么这段代码有时候能关机,有时候关不了呢???求救(200分)

X

xl4772

Unregistered / Unconfirmed
GUEST, unregistred user!
function GetWinVer:byte;
var OS:TOSVersionInfo;
begin
OS.dwOSVersionInfoSize:=Sizeof(TOSVersionInfo);
GetVersionEx(OS);
case OS.dwPlatformID of
VER_PLATFORM_WIN32S :Result:=0;
VER_PLATFORM_WIN32_windows:Result :=1;
VER_PLATFORM_WIN32_NT :Result:=2;
end;
end;


//NT关机准备函数
function SetPrivilege(PrivilegeName : string;Enable : boolean ): boolean;
var
NewState,PreviousState : TTokenPrivileges;
Token : THandle;
dwRetLen : DWord;
begin
Result := False;
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Token);
NewState.PrivilegeCount:=1;
if( LookupPrivilegeValue(Nil,PChar( PrivilegeName ),NewState.Privileges[ 0 ].LUID ))then
begin
if Enable then //Give this privileges
begin
NewState.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
end
else begin //NOT Give this privileges
NewState.Privileges[ 0 ].Attributes := 0;
end;
dwRetLen := 0;
//enables or disables privileges in the specified access token.
Result := AdjustTokenPrivileges(Token,False,NewState,SizeOf( PreviousState ),PreviousState,dwRetLen);
end;
CloseHandle( Token );
end;

procedure TFormClock.ShutDownSystem(EWX_Type:Integer);
begin
if GetWinVer = 2 then
begin
SetPrivilege('SeShutdownPrivilege', true) ;
if (not ExitwindowsEx(EWX_TYPE,0)) then
SetPrivilege('SeShutdownPrivilege', false) ;
end
else ExitwindowsEx(EWX_Type,0);
end ;

procedure TFormClock.PowerOff;
begin
ShutDownSystem(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF );
end;

为什么这段代码有时候能关机,有时候关不了呢??
 
关不了的时候,桌面的东东不见掉,空的,没有任何图标,状态栏什么的。鼠标能动而已
 
点开始->关机的时候也有时关不了啊,怪不得你的.
 
[:(]
可是还是希望这个问题能解决。。。
大家帮我看看代码,是什么问题啊?
或者有什么好的办法能写代码解决关机的问题
 
有的电脑拥护权限例如user是没有惯技权限的!
用gpedit把user的惯技权限允许,就可以了!
 
我的SetPrivilege函数就是这个功能啊。。。

我的问题不在于权限,在于权限允许的情况下,有时可以,有时不可以
 
procedure TMainForm.GetPrivilege;
var
NewState: TTokenPrivileges;
lpLuid: Int64;
ReturnLength: DWord;
ToKenHandle: Cardinal;
begin
OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES
or TOKEN_ALL_ACCESS
or STANDARD_RIGHTS_REQUIRED
or TOKEN_QUERY, ToKenHandle);

LookupPrivilegeValue(nil, 'SeShutdownPrivilege', lpLuid);
NewState.PrivilegeCount := 1;
NewState.Privileges[0].Luid := lpLuid;
NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
ReturnLength := 0;
AdjustTokenPrivileges(ToKenHandle, False, NewState, 0, nil, ReturnLength);
end;



procedure TMainForm.Button2Click(Sender: TObject);
begin
GetPrivilege;
ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;
 
顶部