C语言提升进程权限实现关机

1.简单的关机代码与示例

利用system函数关闭计算机。

#include <stdio.h>
#include <Windows.h>
int 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 <stdio.h>
#include <Windows.h>
int 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 <stdio.h>
#include <Windows.h>
int 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 <stdio.h>
#include <Windows.h>

// 调节进程权限,申请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表示本地计算机。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值