C语言win32学习(1)-关机、重启、注销功能的实现
(2018-01-30 23:23:39)
#include #define _WIN32_WINNT 0x0500 #include BOOL
EnableShutDownPriv() { HANDLE hToken = NULL; TOKEN_PRIVILEGES tkp =
{0}; //得到当前进程的访问令牌的句柄,并且进行
修改令牌权限和查询令牌权限(TOKEN_ADJUST_PRIVILEGES和TOKEN_QUERY) 的操作 if (
!OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
TOKEN_QUERY, &hToken ) ) { return FALSE; }
//LookupPrivilegeValue函数查看系统权限的特权值,返回信息到一个LUID结构体里。 //Windows
NT中调用进程必须有 SE_SHUTDOWN_NAME 特权。
//第一个参数为查询本地系统的权限,第二个参数为指定查询的权限,即SE_SHUTDOWN_NAME,第三个参数用来接收所返回的制定特权名称的信息。
if ( !LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid ) ) { CloseHandle( hToken ); return
FALSE; } tkp.PrivilegeCount = 1;//指定 特权数组的个数(因为下一个参数是一个数组)
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;//特权启用.
//第一个参数是包含特权的句柄 //第二个参数是禁用所有权限标志 //第三个参数是新特权信息的指针(结构体)
//第四个参数是缓冲数据大小,以字节为单位的PreviousState的缓存区(sizeof)
//第五个参数是接收被改变特权当前状态的Buffer //第六个参数是接收PreviousState缓存区要求的大小 if (
!AdjustTokenPrivileges( hToken, FALSE, &tkp,
sizeof(TOKEN_PRIVILEGES), NULL, NULL ) ) { CloseHandle( hToken );
return FALSE; } return TRUE; } BOOL ReSetWindows(DWORD dwFlags,
BOOL bForce) { //检测用户输入的选项 if ( dwFlags != EWX_LOGOFF &&
dwFlags != EWX_REBOOT && dwFlags != EWX_SHUTDOWN ) { return
FALSE; } //得到计算机的版本号 OSVERSIONINFO osvi = {0};
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
//如果没有获取到计算机的版本号,那么返回false if ( !GetVersionEx(&osvi) ) { return
FALSE; } //如果用户的计算机为 windowsNT类型 if ( osvi.dwPlatformId ==
VER_PLATFORM_WIN32_NT ) { //那么需要提升用户权限,也就是管理员权限
EnableShutDownPriv(); } //用户是否选择了强制进行用户操作的标志 dwFlags |= (bForce !=
FALSE) ? EWX_FORCE : EWX_FORCEIFHUNG; return ExitWindowsEx(dwFlags,
0); //执行操作 } int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE
hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { if (
_tcscmp(lpCmdLine, _T("/r")) == 0 ) {//如果是重启的操作
ReSetWindows(EWX_REBOOT, FALSE); }else if ( _tcscmp(lpCmdLine,
_T("/s")) == 0 ) {//如果是关机的操作 ReSetWindows(EWX_SHUTDOWN, FALSE);
}else if ( _tcscmp(lpCmdLine, _T("/l")) == 0 ) {//如果是注销的操作
ReSetWindows(EWX_LOGOFF, FALSE); } return 0; }
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。