static HANDLE hToken;
static TOKEN_PRIVILEGES tp;
static LUID luid;
::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken ) ;
::LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid );
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
::ExitWindowsEx(EWX_POWEROFF|EWX_FORCE, 0);
static TOKEN_PRIVILEGES tp;
static LUID luid;
::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken ) ;
::LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid );
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
::ExitWindowsEx(EWX_POWEROFF|EWX_FORCE, 0);
TOKEN_PRIVILEGES tkp;
DWORD dwVersion;
dwVersion = GetVersion(); //获得Windows NT或Win32的版本号 switch(IsHow)
{
case 0://注销
ExitWindowsEx(EWX_LOGOFF,0);
break; case 1://重新启动
if (dwVersion < 0x80000000)
{// Windows NT系列
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // 设置一个权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0); ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}
else
{//Windows 95系列
ExitWindowsEx(EWX_FORCE | EWX_REBOOT,0);
}
break; case 2://关闭计算机
if (dwVersion < 0x80000000)
{// Windows NT
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // 设置一个权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0); ExitWindowsEx(EWX_POWEROFF |EWX_FORCE, 0);
}
else
{
ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN,0);
}
break;
}
::AdjustTokenPrivileges(hToken,FALSE,&tp,0,NULL,NULL);
^
试试看行不行呀!实在不行,那就GetLastError看看好了
::ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF|EWX_FORCE, 0);
::AdjustTokenPrivileges(hToken,FALSE,&tp,0,NULL,NULL);
^
这个 改了 但不管参数如何为,只能重起机子!
我用系统的关机 可以顺利关机!!!
这是怎么回事,系统是刚装的!
这一句干什么的?
动态加载powrprof.dll文件
运行其中的IsPwrShutdownAllowed函数,取得返回值第二步:
得到特权(NT5系统)第三步:
返回为真,调用ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);
返回为假,调用ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);