重启和关机的问题!(20分)

  • 主题发起人 主题发起人 Carem
  • 开始时间 开始时间
C

Carem

Unregistered / Unconfirmed
GUEST, unregistred user!
if S = 'reboot' then {客户端发出重新启动指令}<br>begin<br>ExitWindowsEx(EWX_FORCE or EWX_REBOOT,0);<br>end;<br><br>if S = 'poweroff' then {客户端发出关机指令}<br>begin<br>ExitWindowsEx(EWX_POWEROFF, 0)<br>end;<br><br>为什么我的2000没有响应?
 
ExitWindowsEx()在Win2000以上有问题的,<br>直接调用Shutdown命令吧<br>
 
W2000以上的系统,要操作机器的操作系统,应该先获取令牌环并调整它:L<br><br>先声明一个过程;<br>procedure AdjustToken();<br>再定义此过程:<br>procedure Tmainf.AdjustToken();<br>var<br>&nbsp; hdlProcessHandle: Cardinal;<br>&nbsp; hdlTokenHandle: Cardinal;<br>&nbsp; tmpLuid: Int64;<br>&nbsp; //tkpPrivilegeCount: Int64;<br>&nbsp; tkp: TOKEN_PRIVILEGES;<br>&nbsp; tkpNewButIgnored: TOKEN_PRIVILEGES;<br>&nbsp; lBufferNeeded: Cardinal;<br>&nbsp; Privilege: array[0..0] of _LUID_AND_ATTRIBUTES;<br>begin<br>&nbsp; hdlProcessHandle := GetCurrentProcess;<br>&nbsp; OpenProcessToken(hdlProcessHandle,<br>&nbsp; &nbsp; (TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY),<br>&nbsp; &nbsp; hdlTokenHandle);<br><br>&nbsp; // Get the LUID for shutdown privilege.<br>&nbsp; LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);<br>&nbsp; Privilege[0].Luid := tmpLuid;<br>&nbsp; Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;<br>&nbsp; tkp.PrivilegeCount := 1; // One privilege to set<br>&nbsp; tkp.Privileges[0] := Privilege[0];<br>&nbsp; // Enable the shutdown privilege in the access token of this<br>&nbsp; // process.<br>&nbsp; AdjustTokenPrivileges(hdlTokenHandle,<br>&nbsp; &nbsp; False,<br>&nbsp; &nbsp; tkp,<br>&nbsp; &nbsp; Sizeof(tkpNewButIgnored),<br>&nbsp; &nbsp; tkpNewButIgnored,<br>&nbsp; &nbsp; lBufferNeeded);<br><br>end;<br><br>重启时如下调用:<br>&nbsp; &nbsp; AdjustToken;<br>&nbsp; &nbsp; ExitWindowsEx((EWX_FORCE or EWX_REBOOT), 0);<br>
 
因为NT(2000)有个安全性问题,如果你的程序没有取得关机的特权(privilege),那么调用ExitWindowsEx会失败,正确的方法应该是这样:<br>1、判断是NT吗?(Win32Platform = VER_PLATFORM_WIN32_NT??),如果不是则直接调用ExitWindowsEx,否则要进行下一步的判断<br>2、用OpenProcessToken来使TOKEN_ADJUST_PRIVILEGES附加到当前进程<br>3、用LookupPrivilegeValue来取得shutdown的LUID<br>4、用AdjustTokenPrivileges来取得关机特权<br>5、如果操作系统版本号大于5,就用EWX_POWEROFF标志,否则用EWX_SHUTDOWN标志(NT4下面没办法软关机),附加上EWX_FORCE标志,调用ExitWindowsEx()<br>
 
谢谢各位帮忙!
 
后退
顶部