热情软件屋

 

能否编程实现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;
    }

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio