请问AdjustTokenPrivileges()的用法(40分)

  • 主题发起人 主题发起人 hekinami
  • 开始时间 开始时间
H

hekinami

Unregistered / Unconfirmed
GUEST, unregistred user!
  大家知道为了能在NT下用ExitWindowsEX()关闭系统,就只有用AdjustTokenPrivileges()打开应用程序的SE_SHUTDOWN_NAME权限。<br>  于是我查了联机帮助中AdjustTokenPrivileges()的用法,无奈在下本来英文就不怎么的,又是初学Windows编程,所以这个用法看得晕晕乎乎,用了以下一段代码:<br>var<br>&nbsp; a:TOKEN_PRIVILEGES;<br>&nbsp; b:array[0..0]of LUID_AND_ATTRIBUTES;<br>begin<br>&nbsp; b[0].LUID:=SE_SHUTDOWN_NAME;<br>&nbsp; b[0].Attibutes:=SE_PRIVILEGES_ENABLED;<br>&nbsp; a.PrivilegeCount:=1;<br>&nbsp; a.Privileges:=b;<br>&nbsp; AdjustTokenPrivileges(Application.Handle,false,a,nil,nil,nil);<br>end;<br>&nbsp; 结果当然是错的了,一大堆的错误:P,我在XP下使用Delphi,我不明白为什么它会告诉我SE_SHUTDOWN_NAME是未定义的标识符,我也不知道是不是应该这样给参数。<br> 问题是低级了一些,对高手是小菜,对我却有难度,分虽给得不多,但请各位伸出援助之手,多谢,多谢。<br>&nbsp; &nbsp; <br>
 
下面代码已经通过测试.<br>procedure ShutDownWindows;<br>&nbsp; const SE_SHUTDOWN_NAME='SeShutdownPrivilege';<br>&nbsp; var hToken:THandle;<br>&nbsp; &nbsp; &nbsp; tkp:TTokenPrivileges;<br>&nbsp; &nbsp; &nbsp; tkpo:TTokenPrivileges;<br>&nbsp; &nbsp; &nbsp; zero:DWORD;<br>&nbsp; begin<br>&nbsp; &nbsp; zero:=0;<br>&nbsp; &nbsp; OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);<br>&nbsp; &nbsp; LookupPrivilegeValue(nil,SE_SHUTDOWN_NAME,tkp.Privileges[0].Luid);<br>&nbsp; &nbsp; tkp.PrivilegeCount:=1;<br>&nbsp; &nbsp; tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;<br>&nbsp; &nbsp; AdjustTokenPrivileges(hToken,False,tkp,SizeOf(TTokenPrivileges),tkpo,zero);<br>&nbsp; &nbsp; ExitWindowsEx(EWX_POWEROFF,0);<br>end;
 
别忘了加入单元,不知是windows, shellapi还是messages之类的,总之自己试试。
 
接受答案了.
 
后退
顶部