系统关机重启
在枚举/结束系统进程或操作系统服务时,会出现权限不足而失败的情况,因此需要提升进程的权限。 1 BOOL SystemRestart() 2 { 3 EnableXXXPrivilege(SE_SHUTDOWN_NAME); 4 return ExitWindowsEx(EWX_REBOOT,0); 5 } windows的每个用户登录系统后,系统会产生一个访问令牌(access token),其中关联了当前用户的权限信息,用户登录后创建的每一个进程都会有用户access token的拷贝,当进程试图执行某些需要特殊权限的操作或是访问受保护的内核对象,系统会检查其access token的权限信息以决定是否授权操作。Administrator组成员的access token中会含有一些可以执行系统级操作的特权(privilege),如终止任意进程,关闭、重启系统、加载设备驱动和更改系统时间等,不过这些特权默认是被禁用的,当administrator组成员创建的进程中包含一些需要特权的操作时,进程必须首先打开这些禁用的特权以提升自己的权限,否则系统将拒绝进程的操作。注意,非administrator组成员创建的进程无法提升自身的权限。 1 BOOL EnableXXXPrivilege( LPCTSTR pszPrivilegeName ) 2 { 3 HANDLE hToken; 4 LUID seXXXNameValue; //本地唯一标识符结构变量 5 TOKEN_PRIVILEGES tkp; //访问令牌权限结构变量 6 7 //获得进程访问令牌的句柄 8 if ( ! OpenProcessToken( GetCurrentProcess(), 9 TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken ) ) 10 { 11 return FALSE; 12 } 13 14 //查询SE_SHUTDOWN_NAME权限所对应的luid值 15 //NULL:本地系统 pszPrivilegeName:SE_SHUTDOWN_NAME 16 if ( !LookupPrivilegeValue( NULL,pszPrivilegeName,&seXXXNameValue)) 17 { 18 CloseHandle( hToken ); 19 return FALSE; 20 } 21 22 //填充Token_Privileges结构 23 tkp.PrivilegeCount = 1; 24 tkp.Privileges[0].Luid = seXXXNameValue; 25 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 26 27 //提升权限 28 if ( !AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL )) 29 { 30 CloseHandle( hToken ); 31 return FALSE; 32 } 33 34 CloseHandle( hToken ); 35 36 return TRUE; 37 } ? 参考:https://blog.csdn.net/chenyonken/article/details/78290810 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |