在NT的服务程序中调用ExitWindowsEx对操作系统的注销,按照Leehunter的指点已经成功,在运行USER32.DLL 或者GDI32.DLL 的API,必须获得window station 和 desktop现在要用ExitWindowsEx进行关机也就是
ExitWindowsEx(EWX_POWEROFF¦EWX_FORCEIFHUNG,0);
MSDN上说要修改线程的权限,于是就在ExitWindowsEx之前调用了
    HANDLE TokenHandle;
    LUID id;
    OpenThreadToken(GetCurrentThread(),TOKEN_ADJUST_PRIVILEGES,
            FALSE,&TokenHandle);
    LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&id);
    TOKEN_PRIVILEGES NewState;
    NewState.PrivilegeCount=1;
    NewState.Privileges[0].Luid=id;
    NewState.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(TokenHandle,FALSE,&NewState,
        sizeof(TOKEN_PRIVILEGES),NULL,NULL);
这样做在普通的程序中可以正确执行,将计算机关闭,但是在NT的服务程序中就不行了
估计是因为线程的句柄不能正确获得,用GetCurrentThread()得到的句柄是无效的
将句柄换成在服务中创建的线程句柄也不行