C++或C控制PC电脑关机、重启、注销

#include <windows.h>

//功能实现  
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;
    //调用API  
    return ExitWindowsEx(dwFlags, 0);
}


//用来提升系统权限
//这是一个通用的提升权限函数,如果需要提升其他权限  
//更改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;
}


int main(int argc, char *argv[])
{
    //调用方法:
    EnableShutDownPriv();

    ReSetWindows(EWX_LOGOFF, false);//注销
    //ReSetWindows(EWX_REBOOT, true);//重启 
    //ReSetWindows(EWX_SHUTDOWN, true);//关机 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值