能否编程实现NT系统的关机并切断电源
编号:QA003113
建立日期: 2000年7月4日 最后修改日期:2000年7月27日
所属类别:
Andy:
操作系统: NT Operating System
编程工具: How to Power off the NT4.0 Workstaion
问题: Hi Is there any way to Power Off the NT 4.0 system by program
水平: 高手
回答:
如果你的机器是ATX结构的,在Win9x/2000下,只要使用ExitWindowsEx时加上参数EWX_POWEROFF就可以实现软件切断电源。但是这在NT下不行。按照NT Resource Kit的说法,需要修改注册表的PowerDownAfterShutdown选项为1,并使用厂商提供的专门的HAL.DLL,就可以切断电源。但问题是很少有厂商提供专门的HAL.DLL。所以基本上无法在NT下实现切断电源。
相关问题:
QA001112 "如何重新启动本机、关机"
dcc的意见:
在NT Service Pack6的压缩包中有可以实现自动关机的hal.dll。
tyt的意见:
http://bbs.1999net.com/view.html?mt=软件王国&gid=3&sk=40777f04&uid=987&vk=6ae8bebafd466&vt=0&pt=954113991&st=0&sp=1&sr=1&sc=1&sw=小河边
tigerzen的意见:
我认为在NT下不行的原因是因为执行ExitWindowsEx时当前进程必须具有SE_SHUTDOWN_NAME(请参考win32sdk关于
ExitWindowsEx的说明),具体方法如下(我只在win2000下测试过该程序,在nt4下我想应该也是可以的):
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
HANDLE hProcess, hToken;
TOKEN_PRIVILEGES NewState;
DWORD ProcessId, ReturnLength = 0;
LUID luidPrivilegeLUID;
ProcessId = GetCurrentProcessId();
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
if(!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken))
return 0;
if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luidPrivilegeLUID))
return 0;
NewState.PrivilegeCount = 1;
NewState.Privileges[0].Luid = luidPrivilegeLUID;
NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(AdjustTokenPrivileges(hToken, FALSE, &NewState, NULL, NULL, NULL))
ExitWindowsEx(EWX_FORCE | EWX_POWEROFF, 0);
return 0;
}
此问题由李海回答。
| |
|
|
| |
|
|