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