2000/NT系统程序关机问题(100分)

  • 主题发起人 主题发起人 qiuxueting
  • 开始时间 开始时间
Q

qiuxueting

Unregistered / Unconfirmed
GUEST, unregistred user!
2000/NT系统程序关机问题:
我有一段关闭2000/NT的代码,可以正确运行,但不能象手动关机时那样完全关机,
而是到“您可以安全关机了”的屏幕提示。
是不是获取权限的那段代码不对?请高手给看一下。
我是在2000 pro下试的。

procedure TForm1.Button1Click(Sender: TObject);
begin
; AdjustToken;
; ExitWindowsEx(EWX_SHUTDOWN, 0);
end;

//获取NT系统的操作权限
procedure AdjustToken();
var
; hdlProcessHandle : Cardinal;
; hdlTokenHandle ; : Cardinal;
; tmpLuid ; ; ; ; ;: Int64;
; tkp ; ; ; ; ; ; ;: TOKEN_PRIVILEGES;
; tkpNewButIgnored : TOKEN_PRIVILEGES;
; lBufferNeeded ; ;: Cardinal;
; Privilege ; ; ; ;: array[0..0] of _LUID_AND_ATTRIBUTES;
begin
; hdlProcessHandle := GetCurrentProcess;
; OpenProcessToken(hdlProcessHandle,
; ; ; ; ; ; ; ; ; ;(TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),
; ; ; ; ; ; ; ; ; ;hdlTokenHandle);
; // Get the LUID for shutdown privilege.
; LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
; Privilege[0].Luid := tmpLuid;
; Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
; tkp.PrivilegeCount := 1; ; // One privilege to set
; tkp.Privileges[0] := Privilege[0];
; // Enable the shutdown privilege in the access token of this process.
; AdjustTokenPrivileges(hdlTokenHandle,False,tkp,Sizeof(tkpNewButIgnored),
; ; ; ; ; ; ; ; ; ; ; ; tkpNewButIgnored,lBufferNeeded);
end;
 
是不是电源或者主板不支持自动关机啊?
 
程序没问题
 
请参考http://www.delphibbs.com/delphibbs/dispq.asp?lid=505863
 
to [RedBeret]
手动关机很好的
 
将EWX_SHUTDOWN改为EWX_POWEROFF,并确认WIN2000的高级电源管理功能已打开
 
在控制面板中的电源选项中选择APM栏,在里面的启用高级电源管理就行了.你试试.
控制面板->电源选项->APM->启用高级电源管理
没有看你上面的程序,不过你的程序应该能够实现关机了,只是你没有选择自动关机,所以就
只停留在那个状态了.当然,你的主机板要支持自动关机.
 
骗分罗,哈哈!!
function ShutDown(uFlags: Cardinal):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;
; Error:integer;
begin
; error:=0;
; // 设置特权
; // Delphi2:
; //if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, @Token) then
; if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token) then
; ; ; Error := Error or 4;
; if not LookupPrivilegeValue(nil, SHTDWN_PRIV,TokenPriv.Privileges[0].Luid) then
; ; Error := Error or 8;
; TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
; TokenPriv.PrivilegeCount := 1; ;// One privilege to set
; if not AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE,Dummy, Len) then
; ; Error:=Error or 16;
; ExitWindowsEx(uFlags, 0);
; Result := (Error=0);
end;





procedure TForm1.BitBtn1Click(Sender: TObject);
begin
;ShutDown(EWX_POWEROFF + EWX_FORCE);
end;

如果关不了,我把头剁下来给你!!
记得给分喔!!
 
to 吴辽
我佩服你的胆量与勇气,敢拿自己的头开玩笑。
我已按Allen的办法试了,管用,你的办法与他的差不多,
权限都是要有的,(电源选项没问题),关键是EWX_SHUTDOWN改为EWX_POWEROFF就行了。
我不明白,98下EWX_SHUTDOWN可以关机,2000必须是EWX_POWEROFF才行,并且
98下用EWX_POWEROFF不是关机,而是重新登陆?请大家赐教。
 
SHUTDOWN是节能啊!
就是休眠。
 
如果我知道管理员的密码与用户名,但我是普通用户登陆,没有关机权限的用户,怎么通过
管理员密码与用户,编程关机呢?
 
硬件问题吧!
 
to qiuxueting ;
关机是调用的windows api,在win98里面ExitWindowsEx的第一个参数只有三个值,0,1,2(说不定
我记错了,哈哈)到了win2000操作系统多了一些功能,比如休眠,等等,所以参数变了,EWX_POWEROFF + EWX_FORCE=12
不知道你有没有试过拨号,在win2000和98和nt也是不一样的喔
 
接受答案了.
 
后退
顶部