windows C++实现注销、重启、关机 logoff reboot shutdown
实现这一功能很简单,主要需要调用一个系统API
ExitWindowsEx
功能就是,注销当前用户,关闭系统,或者重新启动系统。
它会发送一个WM_QUERYENDSESSION消息给所有的应用程序,让他们决定是不是可以被关闭。
函数原型:
<span style="font-size:18px;">BOOL WINAPI ExitWindowsEx(__in UINT uFlags,__in DWORD dwReason);</span>
第一个参数可以是:
EWX_LOGOFF
0
EWX_POWEROFF
0x00000008
EWX_REBOOT
0x00000002
EWX_RESTARTAPPS
0x00000040
EWX_SHUTDOWN
0x00000001
这个参数还可以可选的包含下面两个值
EWX_FORCE
0x00000004 包含这个参数可以让系统强制关机,可能会让应用程序丢失数据
EWX_FORCEIFHUNG
0x00000010
如果在超时时间以后应用进程仍然没有响应WM_QUERYENDSESSION或WM_ENDSESSION消息,那么就强制关闭它们。
返回值:
成功的话返回非0值,失败返回0
可以通过GetLastError()获得更多错误信息。
除了了解这个函数以外,我们还应该清楚:
对于windows NT以上版本的操作系统,我们需要提升一个SE_SHUTDOWN权限,才能完成关机的操作。
NT一下的则不需要,例如95,98,ME
NT以上的系统包括:
下面我们开始具体实现:
关机功能实现
1.检查系统版本,看是不是NT以上,如果是则要提升权限
2.调用系统API,ExitWindowsEx。
#pragma region 功能实现BOOL ReSetWindows(DWORD dwFlags,BOOL bForce){//检查参数是否正确if(dwFlags!=EWX_LOGOFF&&dwFlags!=EWX_REBOOT&&dwFlags!=EWX_SHUTDOWN)return FALSE;//获得系统的版本信息,让我们后面确定是否需要提升系统权限OSVERSIONINFO osvi={0};//获得参数的大小,以提供给GetVersionEx来判断这是一个新版本的OSVERSIONINFO,还是旧版本的//新版本是OSVERSIONINFOEX。扩充版本osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);if(!GetVersionEx(&osvi)){return FALSE;}//检查操作系统的版本,如果是NT类型的系统,需要提升系统权限if(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT){//EnableShutDownPriv();}//判断是否是强制关机,强制关闭系统进程。dwFlags|=(bForce!=FALSE)?EWX_FORCE:EWX_FORCEIFHUNG;//调用APIreturnExitWindowsEx(dwFlags,0);}
#pragma region 用来提升系统权限//这是一个通用的提升权限函数,如果需要提升其他权限//更改LookupPrivilegeValue的第二个参数SE_SHUTDOWN_NAME,即可BOOL EnableShutDownPriv(){HANDLE hToken=NULL;TOKEN_PRIVILEGES tkp={0};//打开当前程序的权限令牌if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken)){return FALSE;}//获得某一特定权限的权限标识LUID,保存在tkp中if(!LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid)){CloseHandle(hToken);return FALSE;}tkp.PrivilegeCount=1;tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;//调用AdjustTokenPrivileges来提升我们需要的系统权限if(!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(TOKEN_PRIVILEGES),NULL,NULL)){CloseHandle(hToken);return FALSE;}return TRUE;}
ReSetWindows(EWX_LOGOFF,false);//注销ReSetWindows(EWX_REBOOT,true);//重启ReSetWindows(EWX_SHUTDOWN,true);//关机
附件列表
windows C++实现注销、重启、关机 logoff reboot shutdown的更多相关文章
- C/C++控制Windows关机/注销/重启的正确姿势
简介 说到代码控制Windows关机/注销/重启的方式,有很多种,最简单的不过就是控制命令行,使用system("pause")函数执行一个shutdown -s -t 0,关机就 ...
- linux注销、关机、重启
一.Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可:[root@laolinux root]#logoutRed Hat Linux release ...
- linux注销开关机
注销:exit 重启:reboot shutdown-r 表示延时分钟数 关机:halt shut -h
- linux基本命令-注销、关机、重起
链接地址:http://blog.163.com/bhao_home/blog/static/6647763120081202047945/ 一.注销,关机,重启 注销系统的logout命令 1,Lo ...
- Linux 登录、注销与关机
Linux 登录.注销与关机 这里主要学习的是命令行环境下的相关操作. 一.登录 Linux 默认的情况下会提供六个终端来让用户登录,切换的方式为使用:[Ctrl + Alt + F1 ~ F6]的组 ...
- Windows 8 自带定时关机的4种实现方法
问题描述:前几天发布了一篇文章[ Windows 7/8 自带定时关机命令 ],文章中的用到的命令我在Windows 7都运行成功,但没有在Windows 8 上进行测试,因为我认为Windows 8 ...
- linux杂记(五)正确关机方法(shutdown,reboot,init,halt)
前言:由于在linux底下,每个程序(或者说是服务)都是在背景下运行的,因此,在你看不到的屏幕背后其实可能有相当多人同时在你的主机上面工作,如果 你直接按下电源开关来关机,则可能导致其他人的数据就此中 ...
- Ubuntu重启关机命令使用
如果你想保持当前用户的登录而且使用root用户执行命令 可以输入:su root,输入密码 可以运行,shutdown 命令 重启命令: 1.reboot 2.shutdown -r now 立刻重启 ...
- Linux下关机命令的区别 (halt,poweroff,reboot,shutdown,init)
1.shutdown shutdown命令安全地将系统关机. 而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭.并且login指令会被冻结﹐即新的用户不能再登录 ...
随机推荐
- R 查看函数源代码
1:输入函数名. 2:methods( ),例如methods(quantile). 3:针对方法2得到的带*的,例stats:::quantile.default.
- JavaScript数据存取的性能问题
JavaScript中四种基本的数据存取位置: 字面量:只代表自身 字符串.数字.布尔值.对象.函数.数组.正则,以及null和undefined 快 本地变量:var定义的 快 数组元素 ...
- 如何在Texstudio内加载语法检查词典?
如何在Texstudio编辑软件内加载"语法检查词典"? How to make dictionary work in TexStudio I am using TexStudio ...
- MySQL主从复制、半同步复制和主主复制概述
http://www.cnblogs.com/zping/p/5275531.html
- 对路径的访问被拒绝,解决之后又报-未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。
服务器环境:Server 2008 64位系统 问题:在导入Excel题录表时报错,1对路径的访问被拒绝,2未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序. 解决方案 ...
- 网页插件学javascript还是jquery好啊?
文章的起因,也是在群内交流是回答一个小伙的问题,一扯就停不下来,但由于个人知识面覆盖有限,自身基础又不够扎实,仅供参考: 问这个问题之前,我个人建议先搞清什么是jquery,什么是js? jq ...
- SqlServer 常用函数
case .. when .. then .. else .. end
- JavaScript - 正则表达式
正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符则匹配失败. 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词默 ...
- rewrite
http://www.iis.net/downloads/microsoft/url-rewrite
- JAVA 各种数值类型最大值和最小值 Int, short, char, long, float,&nbs
转载地址:http://blog.sina.com.cn/s/blog_5eab3d430101fdv6.html 代码片段: fmax = Float.MAX_VALUE; fmin = Float ...