VCpp实现电脑关机_重启_注销

⌚Time: 2022-10-15 14:01:41

👨‍💻Author: Jack Ge

调用OpenProcessToken()LookupPrivilegeValue() AdjustTokenPrivileges()三个函数,程序获得系统操作权限


HANDLE hToken;

TOKEN_PRIVILEGES tp;

LUID luid;

if(::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))

{

    ::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);

    tp.PrivilegeCount=1;

    tp.Privileges[0].Luid =luid;

    tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;

    ::AdjustTokenPrivileges(hToken,false,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);

}

之后调用ExitWindowsEx函数实现关机/重启/注销


ExitWindowsEx(EWX_POWEROFF,0);//关机

ExitWindowsEx(EWX_REBOOT,0);//重启

ExitWindowsEx(EWX_LOGOFF,0);//注销

BOOL ExitWindowsEx(

   UINT uFlags,

   DWORD dwReserved

);

参数

uFlags

指定关闭的类型。此参数必须有下列值的组合:

EWX_FORCE

强制终止进程。当此标志设置,Windows不会发送消息WM_QUERYENDSESSION和WM_ENDSESSION的消息给目前在系统中运行的程序。这可能会导致应用程序丢失数据。因此,你应该只在紧急情况下使用此标志。

EWX_LOGOFF

关闭所有进程,然后注销用户。

EWX_POWEROFF

关闭系统并关闭电源。该系统必须支持断电。

Windows要求:

Windows NT中调用进程必须有 SE_SHUTDOWN_NAME 特权。

Windows 9X中:可以直接调用。

EWX_REBOOT

关闭系统,然后重新启动系统。

Windows要求:

Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。

Windows 9X中:可以直接调用。

EWX_SHUTDOWN

关闭系统,安全地关闭电源。所有文件缓冲区已经刷新到磁盘上,所有正在运行的进程已经停止。

Windows要求:

Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。

Windows 9X中:可以直接调用。

dwReserved

系统保留,这参数被忽略。一般取0

返回值

如果函数成功,返回值为非零。如果函数失败,返回值是零。想获得更多错误信息,请调用GetLastError()函数