//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;
}