注销、关机、重启计算机源码

来源:互联网 发布:如何看懂软件 编辑:程序博客网 时间:2024/05/24 06:48

一段注销、关机、重启计算机的源码,编译环境 WIN7 VS2010

// ExitWindows.h

#define _AFXDLL
#pragma once

#include <afxwin.h>

#define B_LOGOFF          0
#define B_SHUTDOWN        0x00000001
#define B_REBOOT          0x00000002


int BExitWindows(UINT nFlag)
{
HANDLE hToken;
    TOKEN_PRIVILEGES tkp;
DWORD dwVersion;

dwVersion = GetVersion(); //获得Windows NT或Win32的版本号


switch(nFlag)
{
case B_LOGOFF://注销
ExitWindowsEx(EWX_LOGOFF,0);
break;


case B_REBOOT://重新启动
if (dwVersion < 0x80000000)  
{// Windows NT系列
            if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return -1;
            if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid))
return -1;


tkp.PrivilegeCount = 1;  // 设置一个权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;


            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);


            ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}
else
{//Windows 95系列
            ExitWindowsEx(EWX_FORCE | EWX_REBOOT,0);
}
break;


case B_SHUTDOWN://关闭计算机
   if (dwVersion < 0x80000000) 
{// Windows NT
   if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return -1;
            if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid))
return -1;


            tkp.PrivilegeCount = 1;  // 设置一个权限
            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;


            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);


            ExitWindowsEx(EWX_SHUTDOWN |EWX_FORCE, 0);
}
else
{
            ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN,0);
}
break;
    }
return 0;
}
0 0
原创粉丝点击