Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1852020
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 21:40:37

一起学习
浅谈系统的定时关机


作者:武汉市太平洋北大青鸟 Aptech 计算机教育I班 闵尖


下载源代码


在写这个程序之前,我曾看到过别人用SDK写的关机程序。不过他的程序只在WIN9X下有效,在2000中就不行了,不能关机只能注销。因为2000属于多用户操作系统,要想关机就要获得权限。在查阅了MSDN后整理出了这个关机程序。

        TOKEN_PRIVILEGES tkp;

	HANDLE hToken;

    

        if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 

	{

	    MessageBox("OpenProcessToken failed!");

	}



        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); //获得本地机唯一的标识

	tkp.PrivilegeCount = 1;  

	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0); //调整获得的权限

    

	if (GetLastError() != ERROR_SUCCESS) 

	{

            MessageBox("AdjustTokenPrivileges enable failed!");

	}



        fResult =InitiateSystemShutdown( 

             NULL,                 // 要关的计算机用户名,可在局域网网中关掉对方的机器,NULL表示关本机

             "由于系统不稳定,WINDOWS将在上面的时间内关机,请做好保存工作!",  // 显示的消息

             10,                                // 关机所需的时间

             TRUE,                                 

             TRUE);                             //设为TRUE为重起,设为FALSE为关机



        if(!fResult) 

        { 

             MessageBox("InitiateSystemShutdown failed."); 

	} 



        tkp.Privileges[0].Attributes = 0; 

        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0); 



        if (GetLastError() != ERROR_SUCCESS) 

	{

             MessageBox("AdjustTokenPrivileges disable failed."); 

	} 



   	ExitWindowsEx(EWX_SHUTDOWN,0);     //开始关机

      
图一是程序运行画面:


图一

具体实现细节请查阅源代码。WIN2000 VC 6.0下通过编译。

作者通讯地址:武汉市太平洋北大青鸟Aptech计算机教育I班 闵尖
e-mail:minjian_ken@21cn.com

下载本文示例代码


浅谈系统的定时关机浅谈系统的定时关机浅谈系统的定时关机浅谈系统的定时关机浅谈系统的定时关机浅谈系统的定时关机浅谈系统的定时关机浅谈系统的定时关机浅谈系统的定时关机浅谈系统的定时关机浅谈系统的定时关机浅谈系统的定时关机
阅读(232) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~