As is often the case in IT, when you need to push out that software package or migrate that computer to a new domain, it isn’t on the network. This has come up several times in the past year and I wanted to share my solution. Now, this isn’t the “greenest” solution because this will ensure your clients never go into a power saving mode. However, it can be a temporary fix for a project. It can also be adapted to force standby or hibernate at specific thresholds.
While Windows 7 and Vista make this task simple, XP is still a reality in most enterprises and SMB’s and therefore, must be taken into account. The script below does just that. Some additional examples can be found at the US Government’s Energy Star website.
Note: Copying the script from the webpage may cause formatting issues. You can download the script here: tweak-power-settings.vbs
'====================================================== ' VBScript Source File ' NAME: Tweak Power Settings ' AUTHOR: Andrew Healey (andrew -at- healey -dot- io) ' WEB: https://www.healey.io ' DATE : 2010.07.15 (updated 2011.05.03) ' COMMENT: This script will disable hibernate and set strict power settings ' to ensure the system does not power off, hibernate or go into ' standby. This will work on all client operating systems 2000 ' and newer. '====================================================== On Error Resume Next ' Basic checks to see if this will even work and exit if not Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FileExists("c:windowssystem32powercfg.exe") = False Then wscript.quit If Err Then wscript.quit ' Call client os function to determine if it is a server or not ' This script needs modification to run against servers as it is ' meant only for client operating systems. Dim strOS : strOS = isClientOperatingSystem() If strOS = False Then wscript.quit Dim objWshShell : Set objWshShell = WScript.CreateObject("WScript.Shell") ' Disable hibernate if it is enabled If objFSO.FileExists("c:hiberfil.sys") Then If InStr(strOS,"XP") > 0 Then objWshShell.Run "powercfg /hibernate off", 0, True Else objWshShell.Run "powercfg -h off", 0, True End If End If ' Turn off standby and monitor timeout (while plugged in) If InStr(strOS,"XP") > 0 Or InStr(strOS,"2000") > 0 Then ' XP and 2000 specific settings objWshShell.Run "powercfg /X " & chr(34) & "home/office desk" & chr(34) & _ " /standby-timeout-ac 0",0,True objWshShell.Run "powercfg /X " & chr(34) & "home/office desk" & chr(34) & _ " /monitor-timeout-ac 0",0,True objWshShell.Run "powercfg /setactive " & chr(34) & "home/office desk" & chr(34),0,True Else ' Vista, 7 objWshShell.Run "powercfg -s 381B4222-F694-41F0-9685-FF5BB260DF2E",0,True objWshShell.Run "powercfg -change -standby-timeout-ac 0",0,True objWshShell.Run "powercfg -change -monitor-timeout-ac 0",0,True End If ' Clean house Set objWshShell = Nothing Set objFSO = Nothing Private Function isClientOperatingSystem() ' Purpose: This will return true only if the system can be verified as a client OS ' Usage: strOS = isClientOperatingSystem() ' If strOS = False Then wscript.quit Dim objWMIService, objItem, colItems Dim strOS On Error Resume Next ' WMI Connection to the object in the CIM namespace Set objWMIService = GetObject("winmgmts:\.rootcimv2") ' WMI Query to the Win32_OperatingSystem Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") ' For Each... In Loop (Next at the very end) For Each objItem in colItems strOS = objItem.Caption Next ' Below might be a better way but I want to make sure it is one of the operating systems that has been tested, YMMV ' InStr(strOS,"Server") > 0 Then isClientOperatingSystem = False If InStr(strOS,"Windows 7") <> 0 Or InStr(strOS,"XP") <> 0 Or InStr(strOS,"2000 Professional") <> 0 Or InStr(strOS,"Vista") <> 0 Then isClientOperatingSystem = strOS Else isClientOperatingSystem = False End If If Err.Number <> 0 Then isClientOperatingSystem = False strOS = Empty Set objItem = Nothing Set colItems = Nothing Set objWMIService = Nothing On Error GoTo 0 End Function
Nice script, however; it should check for the installed loction of the OS to see if powergfg.exe exists.
‘ Basic checks to see if this will even work and exit if not
Set WSHShell = WScript.CreateObject ( “WScript.Shell” )
fldr = WSHShell.ExpandEnvironmentStrings(“%SystemRoot%”)
filePath = fldr & “system32powercfg.exe”
Dim objFSO : Set objFSO = CreateObject(“Scripting.FileSystemObject”)
If objFSO.FileExists(filePath) = False Then wscript.quit
I suppose. It would be more portable w/ that add. The environment I managed w/ the script (and every environment I have seen) has the system root as c:windows. So, I didn’t see the need to add the extra step. Good add though. That should work for non-standard installations.
Hey Andrew, thanks for the post. You mention Windows 7 “makes this simple” – can you elaborate on that? What would be the scripting approach to change these settings in Win7?
Comments are closed.