关机、注销、重启的C++实现 2011.04.22
2011-04-22 12:15
429 查看
#include <Windows.h>
#include <stdio.h>
//使能关机特权函数
BOOL EnableShutdownPrivilege()
{
HANDLE hProcess = NULL;
HANDLE hToken = NULL;
LUID uID = {0};
TOKEN_PRIVILEGES stToken_Privileges = {0};
hProcess = ::GetCurrentProcess(); //获取当前应用程序进程句柄
if(!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken)) //打开当前进程的访问令牌句柄(OpenProcessToken函数调用失败返回值为零)
return FALSE;
if(!::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&uID)) //获取权限名称为"SeShutdownPrivilege"的LUID(LookupPrivilegeValue函数调用失败返回值为零)
return FALSE;
stToken_Privileges.PrivilegeCount = 1; //欲调整的权限个数
stToken_Privileges.Privileges[0].Luid = uID; //权限的LUID
stToken_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //权限的属性,SE_PRIVILEGE_ENABLED为使能该权限
if(!::AdjustTokenPrivileges(hToken,FALSE,&stToken_Privileges,sizeof stToken_Privileges,NULL,NULL)) //调整访问令牌里的指定权限(AdjustTokenPrivileges函数调用失败返回值为零)
return FALSE;
if(::GetLastError() != ERROR_SUCCESS) //查看权限是否调整成功
return FALSE;
::CloseHandle(hToken);
return TRUE;
}
//关机函数
BOOL Shutdown(BOOL bForce)
{
EnableShutdownPrivilege(); //使能关机特权函数
if(bForce)
return ::ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0); //强制关机
else
return ::ExitWindowsEx(EWX_SHUTDOWN,0);
}
//注销函数
BOOL Logoff(BOOL bForce)
{
if(bForce)
return ::ExitWindowsEx(EWX_LOGOFF|EWX_FORCE,0); //强制注销
else
return ::ExitWindowsEx(EWX_LOGOFF,0);
}
//重启函数
BOOL Reboot(BOOL bForce)
{
EnableShutdownPrivilege(); //使能关机特权函数
if(bForce)
return ::ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0); //强制重启
else
return ::ExitWindowsEx(EWX_REBOOT,0);
}
int main()
{
printf("please input you choice: 1/2/3:/n");
int i;
scanf("%d", &i);
switch (i)
{
case 1:
Logoff(TRUE);//注销
break;
case 2:
Reboot(TRUE);//重启
break;
case 3:
Shutdown(TRUE);//关机
break;
default:
break;
}
//Logoff(FALSE); //注销
//Reboot(FALSE); //重启
//Shutdown(FALSE); //关机
return 0;
}
网上搜来的一篇文章,注释什么的都写得挺详细。
后来看资料,直接用命令,我把上面的实现重写了一下。
不知道在应用中会不会有什么限制:
#include <iostream>
using namespace std;
int main()
{
printf("please enter your choice:/n1.注销/n2.关机/n3.重启/n");
int i;
cin>>i;
switch (i)
{
case 1:
system("shutdown -l");
break;
case 2:
system("shutdown -s");
break;
case 3:
system("shutdown -r");
break;
default:
break;
}
return 0;
}
这个用的命令看似简单,但是我总感觉在程序的应用中会有限制的,
还没佐证,以后问问经验丰富的人,谁让咱现在菜呢
嘿嘿……
#include <stdio.h>
//使能关机特权函数
BOOL EnableShutdownPrivilege()
{
HANDLE hProcess = NULL;
HANDLE hToken = NULL;
LUID uID = {0};
TOKEN_PRIVILEGES stToken_Privileges = {0};
hProcess = ::GetCurrentProcess(); //获取当前应用程序进程句柄
if(!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken)) //打开当前进程的访问令牌句柄(OpenProcessToken函数调用失败返回值为零)
return FALSE;
if(!::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&uID)) //获取权限名称为"SeShutdownPrivilege"的LUID(LookupPrivilegeValue函数调用失败返回值为零)
return FALSE;
stToken_Privileges.PrivilegeCount = 1; //欲调整的权限个数
stToken_Privileges.Privileges[0].Luid = uID; //权限的LUID
stToken_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //权限的属性,SE_PRIVILEGE_ENABLED为使能该权限
if(!::AdjustTokenPrivileges(hToken,FALSE,&stToken_Privileges,sizeof stToken_Privileges,NULL,NULL)) //调整访问令牌里的指定权限(AdjustTokenPrivileges函数调用失败返回值为零)
return FALSE;
if(::GetLastError() != ERROR_SUCCESS) //查看权限是否调整成功
return FALSE;
::CloseHandle(hToken);
return TRUE;
}
//关机函数
BOOL Shutdown(BOOL bForce)
{
EnableShutdownPrivilege(); //使能关机特权函数
if(bForce)
return ::ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0); //强制关机
else
return ::ExitWindowsEx(EWX_SHUTDOWN,0);
}
//注销函数
BOOL Logoff(BOOL bForce)
{
if(bForce)
return ::ExitWindowsEx(EWX_LOGOFF|EWX_FORCE,0); //强制注销
else
return ::ExitWindowsEx(EWX_LOGOFF,0);
}
//重启函数
BOOL Reboot(BOOL bForce)
{
EnableShutdownPrivilege(); //使能关机特权函数
if(bForce)
return ::ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0); //强制重启
else
return ::ExitWindowsEx(EWX_REBOOT,0);
}
int main()
{
printf("please input you choice: 1/2/3:/n");
int i;
scanf("%d", &i);
switch (i)
{
case 1:
Logoff(TRUE);//注销
break;
case 2:
Reboot(TRUE);//重启
break;
case 3:
Shutdown(TRUE);//关机
break;
default:
break;
}
//Logoff(FALSE); //注销
//Reboot(FALSE); //重启
//Shutdown(FALSE); //关机
return 0;
}
网上搜来的一篇文章,注释什么的都写得挺详细。
后来看资料,直接用命令,我把上面的实现重写了一下。
不知道在应用中会不会有什么限制:
#include <iostream>
using namespace std;
int main()
{
printf("please enter your choice:/n1.注销/n2.关机/n3.重启/n");
int i;
cin>>i;
switch (i)
{
case 1:
system("shutdown -l");
break;
case 2:
system("shutdown -s");
break;
case 3:
system("shutdown -r");
break;
default:
break;
}
return 0;
}
这个用的命令看似简单,但是我总感觉在程序的应用中会有限制的,
还没佐证,以后问问经验丰富的人,谁让咱现在菜呢
嘿嘿……
相关文章推荐
- windows C++实现注销、重启、关机 logoff reboot shutdown
- C++ 实现系统注销,重启,关机的方法
- C++ 实现系统注销,重启,关机的方法
- prjShutDownPC - 如何实现关机/重启/注销 - SourceCode - C++ & API & MFC - HackerJLY
- MFC中定时关机、重启、注销的实现
- VB.NET中实现"关机/休眠/重启/注销"的类
- C#实现关机重启及注销实例代码
- 用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠
- linux -- Ubuntu图形界面终端实现注销、关机、重启
- C#实现控制Windows系统关机、重启和注销的方法
- C# 实现系统关机、注销、重启、休眠、挂起
- C#利用Windows API 实现关机、注销、重启等操作
- 在c#中怎么调用ExitWindowsEx函数实现XP的关机、注销、重启操作?
- VB.NET中实现"关机/休眠/重启/注销"的类
- 如何用VC实现系统关机、重启、注销
- C# 实现关机 重启 注销等操作
- VB2005调用API实现注销、关机和重启
- C#实现PC关机,注销,重启
- vc 实现关机 重启 注销
- C#实现控制Windows系统关机、重启和注销的方法: