NT下如何实现关机?

biner 2000-05-24 04:41:00
在NT下关闭计算机,先要从进程获得关机权限,我的代码如下,但是老不成功,不知为什么,请高手指点,谢谢!
procedure TForm1.Button1Click(Sender: TObject);
var
hToken:THandle;
tkp,tkp1:TOKEN_PRIVILEGES;
a:DWORD;
begin
OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);

LookupPrivilegeValue(NiL,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
// LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME,tkp.Privileges[0].Luid);

tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, FALSE, tkp, 0, tkp1,a);

InitiateSystemShutdown(nil,nil,0,TRUE,TRUE);
// exitwindowsex(EWX_SHUTDOWN,0);这样也不行

end;
在VC中有枚举类型SE_SHUTDOWN_NAME,DELPHI中怎么没有?
...全文
134 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeah 2000-05-29
  • 打赏
  • 举报
回复
我没在NT SERVER上试过,但我想如果在SERVER上,没有权限肯定是不行,你是自己的机器还单位网络上的机器?我上面的实际已经是完整代码了,使用BUTTON1的CLICK事件调用即可。
biner 2000-05-26
  • 打赏
  • 举报
回复
yeah,你的代码和我的代码其实是一样的,你的我也试了,还是无法关机,不知是什么原因,我的也是D4/NT4/SP3,我的是NTServer。
你能不能将完整代码发过来,是不是在某些事件里无法关机?
Benni 2000-05-25
  • 打赏
  • 举报
回复
据我所知InitiateSystemShutDown()只有administator才能用。
yeah 2000-05-25
  • 打赏
  • 举报
回复
给你一个过程(REBOOT标志说明重启还是关机)
已在D4/NT4/SP3下通过
procedure ShutDownNT(ReBoot:Boolean);
const
ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
SHTDWN_PRIV = 'SeShutdownPrivilege';
PRIV_SIZE = SizeOf(TTokenPrivileges);
var
Len: DWORD;
TokenPriv, Dummy: TTokenPrivileges;
Token: THandle;
begin
OpenProcessToken(GetCurrentProcess, ADJUST_PRIV, Token);
LookupPrivilegeValue(nil, SHTDWN_PRIV,TokenPriv.Privileges[0].Luid);
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
TokenPriv.PrivilegeCount := 1;
AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE,Dummy, Len);
InitiateSystemShutDown(nil,nil,0,True,Reboot);
end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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