在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()得到的句柄是无效的
将句柄换成在服务中创建的线程句柄也不行
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()得到的句柄是无效的
将句柄换成在服务中创建的线程句柄也不行
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货