Win32 API功能封装
+ -

Windows的关机和重起

2021-08-30 105 0

平时用的最多的是开始菜弹中进行windows的关机或者重启,或者当远程某台电脑台,由于远程session并未提供关机或重启按钮,这时我们经常通过dos命令行来实现关机或重启。
如用如下命令执行立即重启

shutdown -r -t 0

那么怎么通过程序来实现呢?
windows api提供了一个api函数ExitWindowsEx来实现关机或重启。
对于WIN9X系统,可以直接调用,对于WIN2K以上,出于安全考虑,稍有不同,下面分别看一下.

9X系统:

ExitWindowsEx(EWX_LOGOFF,0);     //注销
ExitWindowsEx(EWX_REBOOT,0);     //重启
ExitWindowsEx(EWX_SHUTDOWN,0);   //关机

在程序中直接调用即可.

windows 2000以上系统:

需要相应应的权限,代码如下:

    HANDLE hToken;
    TOKEN_PRIVILEGES tkp;
    OSVERSIONINFO osvi;
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);                               // 取得系统版本

    if (GetVersionEx(&osvi) == 0)
    {
        return false;
    }

    if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
    {
        // Windows NT 3.51, Windows NT 4.0, Windows 2000,
        // Windows XP,  Windows .NET Server win7,win8,win10

        //打开当前进程访问token
        if(!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))
         {
            return false;     
         }                                    

        //获取本地唯一标识用于在特定系统中设置权限
        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);

        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

        //提升访问令牌权限
        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

     }

    ExitWindowsEx(EWX_FORCE, 0);//强制关机,不向进程发送WM_QUERYENDSESSION消息

0 篇笔记 写笔记

Windows的关机和重起
平时用的最多的是开始菜弹中进行windows的关机或者重启,或者当远程某台电脑台,由于远程session并未提供关机重启按钮,这时我们经常通过dos命令行来实现关机重启。如用如下命令执行立即重启shutdown -r -t 0那么怎么通过程序来实现呢?windows api提供了一个api函......
重启Windows系统服务,包括依赖服务的启动
重启Windows系统服务,包括依赖服务的启动.如重启远程访问的服务: TCHAR* Service=TEXT("TermService"); DWORD err = RestartSerivce(Service);代码如下#include
方法1:自己创建设备处理IRP_MJ_SHUTDOWN irp回调 ,还需要调用IoRegisterShutdownNotification函数来关联设备.就可以成功的注册关机通知了.#include "LoadFirst.h"VOID DriverUnload(IN PDR......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!