C语言提升进程权限实现关机-创新互联
1.简单的关机代码与示例
成都创新互联成立以来不断整合自身及行业资源、不断突破观念以使企业策略得到完善和成熟,建立了一套“以技术为基点,以客户需求中心、市场为导向”的快速反应体系。对公司的主营项目,如中高端企业网站企划 / 设计、行业 / 企业门户设计推广、行业门户平台运营、重庆APP开发公司、手机网站开发、微信网站制作、软件开发、双线服务器托管等实行标准化操作,让客户可以直观的预知到从成都创新互联可以获得的服务效果。利用system函数关闭计算机。
#include#includeint main()
{
system("shutdown -s -t 3");
return 0;
}
· 调用system函数需要包含windows.h。
shutdown -s -t 3 -->表示关机在三秒后关机;
-s -->表示关机;
-t -->后面跟时间,时间的单位为秒,表示几秒后关机。如果改为shutdown -s -t 0则表示立即关机;
使用时注意指令之间的空格。
· 取消关机可以使用
system("shutdown -a");
-a -->表示取消关机。
· 示例
#include#includeint main()
{
printf("你的电脑将于1分钟后关闭,回复[我还不想关机]取消关机。\n");
system("shutdown -s -t 60");
flag:
char str[13];
scanf("%s",str);
if (strcmp(str,"我还不想关机")==0)
{
system("shutdown -a");
printf("已取消关机。\n");
}
else
{
goto flag;
}
return 0;
}
函数strcmp用于比较两个字符串是否相等,相等则为0。通过scanf函数来接收用户消息,如果接收到的用户消息是"我还不想关机"则取消关机,否则关机倒计时继续。
· 实现自定义的关机倒计时
#include#includeint main()
{
char str[20] = "shutdown -s -t ";
printf("请输入要关机的时间,单位为秒。\n");
int a = 0;
scanf("%d",&a);
printf("电脑将于%d秒后关机。\n",a);
char time[5];
sprintf(time, "%d", a);
strcat(str, time);
strcat(str,"\0");
system(str);
return 0;
}
函数strcat可以将两个字符串连接,将参数2链接到参数1字符串的后面。比如strcat("str","222"),执行后会把222连到字符串str的最后一个字符。假设str是111,那么执行后结果是111222,即把222连接到111的后面。不过函数strcat的两个参数必须为字符串,因此需要把整形变量a转为字符串。使用sprintf函数进行转换即可,由于a是属于整形变量,因此sprintf中间的转义字符应为%d,之后a会被转换到time字符串里,再使用strcat将time连接到str后即可。如果a的值为60,则运行后str值为"shutdown -s -t 60"。
2. 调节进程权限,使用Win API函数实现关机
API函数关机代码:
InitiateSystemShutdownEx(NULL,(LPSTR)"你的计算机即将关闭",60,FALSE, FALSE, SHTDN_REASON_MAJOR_HARDWARE);
函数InitiateSystemShutdown可用于关闭计算机,它比使用system关机函数有个过人之处,就是它不仅能关机,还可以重启。不足的是它需要SE_SHUTDOWN_NAME权限。
获取SE_SHUTDOWN_NAME权限代码:
bool AdjustPrivilege()
{
HANDLE tk;
TOKEN_PRIVILEGES p;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&tk);
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&p.Privileges[0].Luid);
p.PrivilegeCount = 1;
p.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bool ret = AdjustTokenPrivileges(tk,FALSE,&p,sizeof(p),NULL,NULL);
if (ret == true)
{
return true;
}
return false;
}
函数InitiateSystemShutdownEx参数:
参数1: lpMachineName,表示要关机的计算机网络名称,如果想关闭当前自己的这台计算机,这个参数带NULL。
参数2: lpMessage,表示关机时要不要有一个提示用户即将关机的弹窗,带NULL则不需要弹窗,否则带字符串表示需要弹窗,而该字符串就是弹窗的文本内容,笔者在参数2的字符串为"你的计算机即将关闭",则运行结果如下图所示:
参数3: dwTimeout,关机的倒计时。和上面的system关机函数的时间类似,这里写个整数,比如60则表示60秒后关机。
参数4: bForceAppsClosed,这个参数只能写true/false。如果是写入真,则未保存更改的应用程序将被强行关闭。如果是false,则系统会询问你是否要保存未保存的程序。
参数5: bRebootAfterShutdown,表示需不需要重启。此参数只能写true/false。如果是true,则关机后立即重启。如果是false则系统会将所有缓存刷新到磁盘再关机。
参数6: 关机的原因。系统每次关机都会向系统的日志文件写入关机的信息,比如关机原因。这个参数有很多,即关机原因有很多,笔者这里使用SHTDN_REASON_MAJOR_HARDWARE表示因硬件问题而关机。用户可以选择很多原因写入,比如SHTDN_REASON_MAJOR_POWER电源故障、SHTDN_REASON_MAJOR_SYSTEM系统故障等等,带NULL则未找到关机原因,但带NULL可能会延迟关机时间。
完整代码:
#include#include// 调节进程权限,申请SE_SHUTDOWN_NAME特权
bool AdjustPrivilege()
{
HANDLE tk;
TOKEN_PRIVILEGES p;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&tk);
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&p.Privileges[0].Luid);
p.PrivilegeCount = 1;
p.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bool ret = AdjustTokenPrivileges(tk,FALSE,&p,sizeof(p),NULL,NULL);
if (ret == true)
{
return true;
}
return false;
}
int main()
{
AdjustPrivilege();
printf("60秒后将关闭你的计算机\n");
InitiateSystemShutdownEx(NULL, (LPSTR)"你的计算机即将关闭", 60, FALSE, FALSE, SHTDN_REASON_MAJOR_HARDWARE);
return 0;
}
· 取消关机还可以用
AbortSystemShutdown(NULL);
该函数可以中止计算机关机,相对于system("shutdown -a"),带NULL表示本地计算机。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享文章:C语言提升进程权限实现关机-创新互联
网页路径:http://azwzsj.com/article/dpgssi.html