系统定时休眠

单位最近加强安全检查,除了部分服务器,下班不关机器的同事,都被罚了款。为此,我试着下载了几个自动关机的程序,但是都不好使。都是最后显示“你可以安全地关闭计算机了!”。到网上问了半天说是高级电源管理设置的问题。我折腾了半天,还是不行,为什么Windows自己的关机就可以关掉电源,而我们的程序就只能“你可以安全的关闭计算了!”。看来微软还不知道在哪里留了一手。

好在还有收获,最近发现MSDN还有这么一个函数

BOOL SetSystemPowerState(
 BOOL fSuspend, // system state
 BOOL fForce   // forced suspension option
);

真是好东东,比关机器还好,在任何情况下都可以切断电源(这正是我想要的),也不会有讨厌的提示。

函数很简单,但直接用不好使,前面得加些罗哩八嗦的东东,所以我就进行了一下封装。

void PERR(LPTSTR szAPI, DWORD dwLastError);
#define RTN_ERROR 13
INT SetPower()
{
  
  // TODO: Add your control notificationhandler code here
  TOKEN_PRIVILEGES tp;
  HANDLE hToken;
  LUID luid;
  LPTSTR MachineName=NULL; // pointer to machine name
  if(!OpenProcessToken(GetCurrentProcess(),
            TOKEN_ADJUST_PRIVILEGES,
            &hToken ))
  {
    PERR("OpenProcessToken", GetLastError() );
    return RTN_ERROR;
  }
  if(!LookupPrivilegeValue(MachineName, SE_SHUTDOWN_NAME, &luid))
  {
    PERR("LookupPrivilegeValue", GetLastError() );
    return RTN_ERROR;
  }
  tp.PrivilegeCount      = 1;
  tp.Privileges[0].Luid    = luid;
  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
                NULL, NULL );
    SetSystemPowerState(FALSE,TRUE);
    return 0;
}
void PERR(
  LPTSTR szAPI,    // pointer to failed API name
  DWORD dwLastError  // last error value associated with API
  )
{
  LPTSTR MessageBuffer;
  DWORD dwBufferLength;
  //
  // TODO get this fprintf out of here!
  //
  fprintf(stderr,"%s error! (rc=%lu)\n", szAPI, dwLastError);
  if(dwBufferLength=FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                  FORMAT_MESSAGE_FROM_SYSTEM,
                  NULL,
                  dwLastError,
                  LANG_NEUTRAL,
                  (LPTSTR) &MessageBuffer,
                  0,
                  NULL))
  {
    DWORD dwBytesWritten;
    //
    // Output message string on stderr
    //
    WriteFile(GetStdHandle(STD_ERROR_HANDLE),
         MessageBuffer,
         dwBufferLength,
         &dwBytesWritten,
         NULL);
    //
    // free the buffer allocated by the system
    //
    LocalFree(MessageBuffer);
  }
}

注意:此函数只运行于Windows 2000/XP,并且打开了高级电源管理的休眠支持。

根据这个函数,写了个小东东,我不想让他一直运行占我的资源。于是就在计划任务里建了一个任务,只要在检查之前执行就行。呵呵!

总之没什么高深的,我也是菜鸟,如果你知道了就不要看了,希望那些爱骂人“高手”不要骂我:-)

本文配套源码

时间: 2024-10-20 22:23:29

系统定时休眠的相关文章

win7系统进入休眠出现错误0xc000007f代码的原因及解决方法

  休眠菜单是在windows系统下必备的菜单选项,通常情况下我们在长时间下离开电脑,系统会在用户所设置的时间里进入休眠状态,当然我们也能够手动进入休眠,不过近期有部分用户在使用休眠菜单,却出现了系统错误,其错误代码为0xc000007f,很多用户第一次出现该问题时,都比较束手无措,所以小编为大家带来了一种解决方法,希望对大家有所帮助! 原因分析 此错误代码是访问异常,检查磁盘空间发现系统盘的空间小于当前内存的大小,目前内存16G,系统盘硬盘空间剩余仅8G左右,导致休眠文件创建失败. 解决方案

win7系统无法休眠弹出能源策略管理器无法保留怎么办?

  win7系统无法休眠弹出能源策略管理器无法保留怎么办? 1.按下"win+r"组合键呼出运行,在运行框内输入"cmd"然后按下回车键打开"命令提示符"; 2.在命令提示符框内输入"powercfg -h off"然后按下回车键,并重启计算机; 3.重启计算机之后按照第一步重新打开"命令提示符",在里面输入"powercfg -h on"按下回车键即可.

WinXP系统定时关机方法

WinXP系统定时关机方法   其中7200是秒数,等于2小时.单击确定后,会出现如下对话框,显示倒计时! 如果此时要取消定时关机,可通过点击 开始-运行,键入 shutdown /a 实现.

XP系统自动休眠怎么设置

XP系统自动休眠怎么设置   设置成自动休眠的方法: 1. 以管理员帐户登录到计算机上. 2. 单击"开始", 单击控制面板,双击电源选项,单击休眠选项卡,在休眠选项卡里选中"启用休眠"复选框(如果休眠选项卡不 可用,说明硬件设备无法支持该特性),再单击"应用"; 3. 单击"高级电源管理"选项卡,单击"启用高级电源管理支持",然后单击"应用"; 4. 击 "电源使用方案&qu

win7系统定时关机任务怎么设置?

  win7系统定时关机任务怎么设置?            具体设置方法如下: 1.[所有程序]--[附件],在附件中的[系统工具]中找到[任务计划程序]并打开; 2.在右边的操作中选择[创建基本任务],你可以在[任务名称]中填写你想填的名字,这里填写的是"定时关机"; 任务计划程序 任务计划程序 3.选择任务执行时间,对于每天都要定时关机的可以选择"每天";对于每个星期中有几天不需要关机的可以选择"星期";至于"每月"不推

Win8.1系统开启休眠提示“不支持该请求”怎么解决

Win8.1系统开启休眠提示"不支持该请求"怎么解决   具体步骤如下: 1.清理磁盘临时文件,看看你的回收站多久没清理,卸载不常用软件,安装到其它盘符; 2.把临时文件夹,虚拟内存,文档设置到其它盘符; 3.终极方法是通过划分其它盘符的容量给系统盘; 4.最后打开命令提示窗口,还是以管理员身份运行,然后输入"powercfg -h on",这样就又开启了休眠.

linux系统如何休眠

  linux系统休眠 在linux下,我喜欢用命令让系统进入休眠: $ echo mem | sudo tee /sys/power/state 当然,不用每次都要敲这么一长串,可以把它加入到一个脚本中. 再将该脚本命令加入到/etc/sudoers文件,就可以避免每次都需要输入用户密码了. 有同事搞不清楚为什么下面的命令执行不成功: $ sudo echo mem > /sys/power/state 上面这个shell命令的流程是:fork一个子进程,等待 → shell关闭标准输出,打开

Mac安装Win10系统后休眠直接关机如何解决

  Mac安装Win10系统后休眠直接关机的解决方法 原因: 1.由于MacBook的构造不同于一般的Windows笔记本,驱动最好只用Boot Camp来安装,用其他的软件安装驱动可能出现各种问题. 2.Windows10系统的自动更新也包括驱动的更新,而我们的MacBook的驱动也会被强制更新,以致休眠/睡眠异常,开机黑屏30秒左右等.该锋友猜测,开机黑屏30秒的主要原因是显卡驱动不兼容,而休眠/睡眠异常则是与主板驱动不兼容有关. 要想解决这个问题,我们只需要排除掉可能引起问题的驱动更新即可

Win8.1系统无法休眠的解决办法

  Win8.1系统用户想重新开启休眠功能,可以通过打开命令提示窗口,然后输入"powercfg -h on" . 但是这时候问题就来咯,提示"休眠失败,错误如下: 不支持该请求". 出现这种情况是你的磁盘空间不够生成休眠文件(hiberfil.sys),其大小和物理内存一样大.假设你升级了内存,hiberfil.sys文件也会随着内存的增加而变大.在磁盘不足的情况,系统默认会关闭休眠功能. Win8.1系统无法休眠的解决办法: 1.清理磁盘临时文件,看看你的回收站