注册表实现windows系统的关机、注销和重启

来源:互联网 发布:必读国学经典知乎 编辑:程序博客网 时间:2024/05/16 19:05


这里我们主要讲的是Windows2000以上的操作。因为在Windows2000以上的操作系统,ExitWindowsEx等函数需要有一定的权限才能运行。所以在调用ExitWindowsEx函数前要获得较高的系统权限。

     那么如何才能提高系统权限呢?我们需要用到3个函数:OpenProcessToken、LookupPrivilegeValue、AdjustTokenPrivileges。

    下面是Windows2000及以上关机、注销、重启的具体代码:


//关机 
void ShutDown(){
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
//打开当前进程信令
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken)){
printf("open ProcessToken error \n");
return;
}
//获取本地唯一标示用于在特定的系统中设置权限
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);
//关机。
//重启:将第一个参数换成EWX_REBOOT|EWX_FORCE
//注销:将第一个参数换成EWX_LOGOFF|EWX_FORCE
ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);
}
//注销
void LogOff()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
return;
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_LOGOFF|EWX_FORCE,0);

}


//重启
void Reboot()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
return;
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);

}

0 0