一段注销、关机、重启计算机的源码,编译环境 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;
}