请问在win2000下调用关闭系统api运行出错,提示没有运行权限,在win98下可以,怎么办?

tbaep 2002-08-17 12:28:43
请问在win2000下调用关闭系统api运行出错,提示没有运行权限
我是这样调用的:
Win32Check(ExitWindowsEx(EWX_SHUTDOWN,0))
但是运行出错?
...全文
86 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tbaep 2002-08-17
  • 打赏
  • 举报
回复
unionsoftzboy(unionsoftzboy) 的方法我试了,不需要直接关掉机器电源
banxian 2002-08-17
  • 打赏
  • 举报
回复
偶不要你的分,呵呵
banxian 2002-08-17
  • 打赏
  • 举报
回复
书上说,对于Windows NT(2000就是NT5.0),参数为0(LOGOFF)不需特权.
参数为1(shutdown),2(REboot)需要SE_SHUTDOWN_NAME特权.
不知道实际怎样.没有试过
tbaep 2002-08-17
  • 打赏
  • 举报
回复
我是在Administrator权限下执行的程序啊
unionsoftzboy 2002-08-17
  • 打赏
  • 举报
回复
你需要调用AdjustTokenPrivileges函数给当前进程授权:
procedure AdjustToken;
Const TOKEN_ADJUST_PRIVILEGES = $20;
TOKEN_QUERY = $8;
SE_PRIVILEGE_ENABLED = $2;
var
hdlProcessHandle,hdlTokenHandle:THandle;
tmpLuid :TLargeInteger;
tkp :TTOKENPRIVILEGES;
lBufferNeeded : DWord;
begin
SetLastError(0);
hdlProcessHandle := GetCurrentProcess();
OpenProcessToken(hdlProcessHandle,
(TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle);
LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Luid := tmpLuid;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hdlTokenHandle,
False,
tkp,
0,
nil,
lBufferNeeded);

end;
解决了的话,记得给俺分哟。
banxian 2002-08-17
  • 打赏
  • 举报
回复
2000下必须有Administrator权限(偶是看书上说的)
tbaep 2002-08-17
  • 打赏
  • 举报
回复
希望:unionsoftzboy(unionsoftzboy)帮我解决能够关掉电源的问题

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧