/
/
1.
请求令牌
HANDLE hToken
=
NULL;
/
/
2.
进程伪句柄
HANDLE hProcess
=
GetCurrentProcess();
/
/
3.OpenProcessToken
函数打开与进程关联的访问令牌
/
/
所有权限可以写TOKEN_ALL_ACCESS ,去查看一个令牌特权可以用TOKEN_QUERY
OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
/
/
4.
使用AdjustTokenPrivileges需要的内容
/
/
在这个函数中的第
3
和第
5
个参数中需要用到一个TOKEN_PRIVILEGES的结构体
/
/
在这个结构体中还有个LUID_AND_ATTRIBUTES结构体
/
/
TOKEN_PRIVILEGES:参数
1.
要修改的特权数目 参数
2.
特权数组
/
/
LUID_AND_ATTRIBUTES:
/
/
参数
1.
第一个参数是Luid是一个标志,不同的Luid代表着各种不同的特权类型
/
/
Luid的值需要用LookupPrivilegeValue来获取
/
/
参数
2.
第二个参数是要这个特权干嘛,如启用这个特权(SE_PRIVILEGE_ENABLED)
/
/
LookupPrivilegeValue:
/
/
第一个参数是系统的名字,如果为NULL,就是本地名字
/
/
第二个参数是特权的名字
/
/
第三个参数就可以通过指针返回一个LUID类型的Luid的标识了
TOKEN_PRIVILEGES tp
=
{
0
};
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tp.Privileges[
0
].Luid);
tp.PrivilegeCount
=
1
;
/
/
5.
权限使用
tp.Privileges[
0
].Attributes
=
SE_PRIVILEGE_ENABLED;
/
/
6.
调用函数提升权限
/
/
AdjustTokenPrivileges(
/
/
HANDLE TokenHandle, OpenProcessToken第三个指针参数传出的句柄值
/
/
BOOL
DisableAllPrivileges, 是否禁用所有所有的特权
/
/
PTOKEN_PRIVILEGES NewState, 新的TOKEN_PRIVILEGES的特权结构体指针
/
/
DWORD BufferLength, 新的TOKEN_PRIVILEGES的特权结构体指针
/
/
PTOKEN_PRIVILEGES PreviousState, 接受原先的特权的结构体
/
/
PDWORD ReturnLength 这个结构体的字节长度的指针
/
/
);
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
switch (nID)
{
/
/
A.关机
case ID_32792:
{
/
/
ExitWindowsEx注销交互式用户、关闭系统或关闭并重新启动系统
/
/
EWX_POWEROFF 关闭系统并关闭电源
/
/
EWX_FORCE 如果启用了终端服务,则此标志不起作用,这可能会导致应用程序丢失数据
/
/
SHTDN_REASON_MAJOR_APPLICATION 应用程序问题
/
/
EWX_REBOOT 关闭系统,然后重新启动系统
/
/
EWX_LOGOFF 它会将用户注销
/
/
ExitWindowsEx(EWX_POWEROFF | EWX_POWEROFF, SHTDN_REASON_MAJOR_APPLICATION);
MessageBox(_T(
"电脑已关机--注释"
));
break
;
}
/
/
B.重启
case ID_32793:
{
/
/
ExitWindowsEx(EWX_REBOOT | EWX_POWEROFF, SHTDN_REASON_MAJOR_APPLICATION);
MessageBox(_T(
"电脑已重启--注释"
));
break
;
}
/
/
C.注销
case ID_32794:
{
/
/
ExitWindowsEx(EWX_LOGOFF | EWX_POWEROFF, SHTDN_REASON_MAJOR_APPLICATION);
MessageBox(_T(
"电脑已注销--注释"
));
break
;
}
/
/
D.休眠
case ID_32795:
{
/
/
包含头文件:挂起或休眠系统,或请求挂起或休眠系统
/
/
/
/
SetSuspendState(TRUE, FALSE, FALSE);
break
;
}
/
/
E.睡眠
case ID_32796:
{
SetSuspendState(FALSE, FALSE, FALSE);
break
;
}
/
/
F.锁屏
case ID_32797:
{
LockWorkStation();
break
;
}
default:
break
;
}