The ticket always reads the same way. "I closed the lid at 6pm with 80 percent. At 8am it was flat." Somebody checks the power plan, sees Sleep set to 15 minutes, declares the settings correct, and closes the ticket as user error. Then it happens again on a different model, and again on a whole batch of a new hardware refresh. The reason this keeps happening is that almost nobody in the helpdesk chain knows that the laptop never went to sleep in the way they are imagining. On most modern hardware, "sleep" is not the old S3 state where the CPU is parked and RAM is merely refreshed. It is a state where Windows is technically still running, drivers are still loaded, the network can still be alive, and any badly behaved component can quietly burn a battery all night behind a closed lid. This post explains what that state actually is, how to tell which one a device is in, and which built-in reports name the exact component that drained the battery.
Most current laptops do not use S3 sleep. They use Modern Standby, an S0 low-power idle state where the system stays partially running, which Microsoft documents as mutually exclusive with S1-S3. Run powercfg /a to see which model a device uses and whether it is the Connected or Disconnected variant. Then use powercfg /requests, powercfg /waketimers and the powercfg /sleepstudy report, which names the five most active components in each sleep session, to attribute the drain to a specific requester instead of guessing. You cannot switch a device from Modern Standby to S3 by changing a setting, so the fix is always to control the wake and request surface, via Power.admx in Group Policy or the matching settings in the Intune settings catalog.
The problem: the lid was shut and the battery still went
Two different tickets share one wrong diagnosis. Learn to tell them apart before you touch anything.
The first shape is overnight drain. The lid is closed, nobody touches the machine, and the battery loses far more charge than it should. The user reports "it does not sleep properly". They are closer to right than the helpdesk usually admits.
The second shape is the machine wakes up on its own. The user finds the fan spinning in a bag, or the machine warm, or the lock screen already on when they open the lid. Sometimes both shapes happen on the same device, because a wake is what starts the drain.
The wrong diagnosis in both cases is "the power plan is misconfigured". The power plan usually is not misconfigured. What is actually happening is that the sleep state itself behaves nothing like the one the engineer is picturing.
Here is the sentence to internalise. Microsoft's own documentation of ACPI system power states says of the Modern Standby state: "the system remains partially running". Not off. Not parked. Partially running. Everything else in this post follows from that.
| Power state | ACPI state | What Microsoft documents about it |
|---|---|---|
| Working | S0 | "The system is fully usable." Unused hardware components can still drop to lower device states. |
| Sleep (Modern Standby) | S0 low-power idle | Present only on some SoC systems. The system "can very quickly switch from a low-power state to high-power state in response to hardware and network events". Microsoft states plainly: SoC systems that support Modern Standby "don't use S1-S3". |
| Sleep | S1 S2 S3 | "The system appears to be off." Volatile memory is kept refreshed to maintain system state. Systems typically support one of the three, not all three. |
| Hibernate | S4 | "The system appears to be off." Memory contents are written to the hibernation file so DRAM can be powered off entirely. |
| Soft off | S5 | A full shutdown and boot cycle. |
| Mechanical off | G3 | Completely off, consuming no power. |
Read the second and third rows together. S1-S3 is the state where the machine "appears to be off" and only memory refresh keeps state alive. S0 low-power idle is a variant of the working state. That is not a naming quirk. It is the mechanism, and it is why an app can keep a Modern Standby laptop busy all night in a way it never could on an S3 machine.
Why it happens: S0 low-power idle is the working state with the screen off
What Modern Standby actually is
Modern Standby is Microsoft's name for the S0 low-power idle power model on Windows PCs. The documentation describes it as an expansion of the Windows 8.1 Connected Standby model, extended to hardware that could not meet the original Connected Standby bar, including systems with rotational or hybrid storage and network adapters that lack the full offload capability.
The design goal is a phone-like experience: "instant on / instant off", with the network stack able to stay alive so the device can be woken by a packet as well as by a button. The documentation is explicit that Windows and the SoC "are always listening for interesting events (such as a network packet or user input at a keyboard) and will wake up instantly when needed".
Two consequences fall out of that design, and they are the entire root cause of the drain tickets:
- Because the system is still running, software can still run. Microsoft calls the components allowed to keep the SoC active activators, because they register with the power manager as capable of blocking the return to the idle power mode.
- Because the network can stay alive, network events can wake the machine. That is a feature when a VoIP call arrives and a defect when a driver wakes the machine every four minutes.
Screen Off is not Sleep
Microsoft splits a Modern Standby session into two documented states, and you need both names to read the reports later.
| State | What runs in it | Expected duration |
|---|---|---|
| Screen Off | The period where the system is being quiesced and larger workloads are still finishing. Blockers live here. | Documented as "typically expected to have a short duration". |
| Sleep | The long-term low-power state. Only "explicitly allowed, value-adding activities" run. The system mostly sits in DRIPS. | The bulk of an overnight session should be here. |
DRIPS is worth spelling out because every report uses it: deepest runtime idle platform state. It is the state in which, per the documentation, "no software activity runs whatsoever". A sleep session with a low DRIPS percentage is a session where something kept waking the silicon up.
The phase chain: where a blocker actually blocks
When the screen turns off, Windows walks a documented, sequential set of phases to quiet the system down. Each phase must complete before the next starts. This is the chain to picture when a machine "will not go to sleep".
| Phase, in order | What the system is waiting for | Documented duration behaviour |
|---|---|---|
| No-CS phase | The sleep timeout to elapse, and outstanding power requests from applications to expire. | Typically under a second. But power requests "will block the NoCS phase indefinitely on AC power, and for up to 5 minutes on DC power". Audio and mobile hotspots are allowed to run indefinitely. |
| Connection phase | Remote Desktop sessions to be gone. | Zero seconds if none are connected; otherwise lasts until they disconnect or time out. |
| Process Lifetime Manager (PLM) phase | Foreground Microsoft Store apps to be suspended, and audio to stop. | Typically under five seconds. |
| Maintenance phase | Running system maintenance tasks to finish. | Most likely to block on AC power. |
| Desktop Activity Moderator (DAM) phase | Desktop applications to be suspended. | Typically under one second. |
| Low-power phase | Registered subscribers to be notified. This is where Screen Off ends and Sleep begins. | Typically five seconds. |
| Resiliency notification phase | The network subsystem to be told to go low-power. Adapters that cannot do Modern Standby are turned off (D3). | Typically under one second. |
| Resiliency phase | Nothing. This is the steady state where activators may briefly run. Session-0 services are throttled by the DAM to no more than one second of activity every 30 seconds. | "The majority of time the system is spent in DRIPS." |
Notice the first row. On AC power, one application holding a power request blocks sleep entry indefinitely. On battery it blocks for up to five minutes. That five-minute figure is documented twice: in the phase table and in the power request reference, which states "on Modern Standby systems on DC power, power requests are terminated after 5 minutes". Microsoft also tells you exactly how to find the culprit: "The applications with power requests can be inspected by running Powercfg.exe with the /requests option."
The two variants: connected and disconnected standby
Modern Standby comes in two flavours, and the difference is entirely about whether the network survives the sleep.
- Connected Standby. The network adapter supports the required protocol offload and wake-pattern behaviour, so the system can stay on the network during standby.
- Disconnected Standby. Microsoft's definition is precise: "If a system's NIC is not offload-capable, but the system reports in the FADT table that it supports S0 low power idle, it is using Disconnected Standby." FADT is the ACPI Fixed ACPI Description Table, one of the firmware tables that advertises platform capability.
You do not guess which one you have. The distinction shows up as literal text in the powercfg /a output, and that command is covered in the next section.
There is a third behaviour layered on top since Windows 10 version 2004: Adaptive Connected Standby (ACS), which is now the connectivity default on Modern Standby systems. With ACS, Windows itself decides whether to keep connectivity alive while on battery. It grants Internet connectivity to apps that need it, such as when Remote Desktop is enabled or a UWP app is set to always run in the background, and otherwise quiesces networking during sleep while keeping the network instantly ready on resume. The documentation notes that ACS decides the connectivity type at the start of a sleep session and keeps it for the whole session.
The 24H2 change you will trip over
Windows 11 version 24H2 added a defensive behaviour that changes what you will observe on newer builds. The wake sources documentation states that "a new power-saving measure was introduced to Modern Standby to prevent unexpected battery drain. If excessive battery drain is detected, most wake sources will be disabled. In this state, the device can be woken from Modern Standby by pressing the power button or opening the lid."
That has a direct diagnostic consequence. A user reporting "my machine will not wake on a key press any more" on 24H2 may be seeing Windows protecting itself from a drain problem you have not found yet. The sleepstudy exit-reason list includes matching codes for it, documented as Restricted Standby Battery Drain Budget Exceeded, Restricted Standby Doze Timeout and Smart Restricted Standby. Two other 24H2 behaviour changes belong in the same mental note: pressing the power button now engages input suppression so the display will not turn on in clamshell mode with the lid closed unless an external display is attached, and Voice Input is no longer supported as a wake source from sleep.
The binaries and the database behind all of this
Naming the components makes the flow concrete. Everything below was confirmed present on a Windows 11 Enterprise build 26200 device; the role descriptions come from Microsoft documentation where documentation exists, and I flag where it does not.
| File | Role in the flow | Sourcing |
|---|---|---|
C:\Windows\System32\powercfg.exe | The command-line tool documented for controlling power schemes, reporting available sleep states, controlling device power states and analysing energy problems. Every diagnostic in this post runs through it. | Documented. |
C:\Windows\System32\ntoskrnl.exe | Hosts the kernel power manager, the component the driver documentation names as the thing that turns off audio and video for away mode and that services driver power requests. | Power manager documented; binary presence verified on device. |
C:\Windows\System32\umpo.dll | The user-mode power service component. Loaded by the Power service. Microsoft does not publish a reference page for this DLL. | Observed on device, undocumented role. Do not build detection on it. |
C:\Windows\System32\umpodev.dll | Companion user-mode power device component to umpo.dll. | Observed on device, undocumented. |
C:\Windows\System32\powrprof.dll | Exports the documented power profile API surface, including SetSuspendState, which is the API named in the event that records a process forcing a sleep transition. | API documented. |
C:\Windows\System32\drivers\pdc.sys | The Power Dependency Coordinator. The sleepstudy report's offender types and exit reasons include PDC Phase and PDC Signal entries, and the phase documentation refers to "PDC resiliency clients". | PDC concept documented in the reports; driver file observed on device. |
C:\Windows\System32\drivers\acpi.sys, battc.sys, cmbatt.sys | The ACPI driver and the battery class and control-method battery drivers. These are what surface the _BST, _BIX and _BTP control methods that the sleepstudy drain calculation reads. | Control methods documented; driver files observed on device. |
C:\Windows\System32\sru\SRUDB.dat | The System Resource Usage Monitor database. This is the store that powercfg /srumutil dumps energy estimation data from. | The /srumutil option and SRUM are documented; the on-disk path is observed on device and not documented, so treat it as an implementation detail. |
C:\Windows\System32\energyprov.dll | Energy provider component associated with the energy reporting surface. | Observed on device, undocumented. |
Services and the one scheduled task
Four services and one task are worth knowing by name on a drain investigation.
| Short name | Display name | Why it matters here |
|---|---|---|
Power | Power | The power policy service. Expected Running. Loads the user-mode power components. |
SystemEventsBroker | System Events Broker | Expected Running. This is the service that appears as the owner of most armed wake timers, including the ones set on behalf of scheduled tasks. You will see it by name in powercfg /waketimers. |
DPS | Diagnostic Policy Service | Expected Running. Hosts diagnostic scenarios and is the service context around SRUM energy estimation. |
SysMain | SysMain | Expected Running by default. Frequently blamed for standby activity in forum folklore. Verify it in a sleepstudy top-offenders table before you touch it, rather than disabling it on a hunch. |
That task existed and was in the Ready state on the test device. It is the in-box power efficiency analysis task. It is the only scheduled task under \Microsoft\Windows\ that is dedicated to power efficiency diagnostics, so if you are looking for "the built-in thing that checks power health", that is it.
How to verify: powercfg first, reports second, guessing never
Step one, always: which sleep model is this
Every investigation starts with one command. powercfg /a reports the sleep states available on the system and, per the documentation, "attempts to report reasons why sleep states are unavailable". Run it from an elevated prompt.
Now read the reason strings, because they are the part everyone misinterprets.
| Reason string | What it actually means |
|---|---|
| "The system firmware does not support this standby state." | The platform firmware never advertised this S-state to Windows in its ACPI tables. This is a hardware and firmware fact, not a Windows setting. On a Modern Standby laptop this line against S1, S2 and S3 is normal and expected. It is not a fault to fix. |
| "This standby state is disabled when S0 low power idle is supported." | Windows itself is suppressing S1-S3 because the platform advertises S0 low-power idle. This is the documented mutual exclusion between the two models stated in the OS output. |
| "The current Device Guard configuration has disabled this standby state." | Virtualization-based security is active on this device and has taken S3 off the table as well. This is the one place where your security baseline and your power model genuinely intersect. |
| "The hypervisor does not support this standby state." | A hypervisor is running, which is normal on a VBS-enabled machine, and it blocks the state. |
| "This action is disabled in the current system policy." | Policy or configuration on the device has turned the item off, as opposed to firmware or hardware being incapable. |
CsEnabled or PlatformAoAcOverride value under HKLM\SYSTEM\CurrentControlSet\Control\Power, are not documented by Microsoft, and on the Windows 11 build 26200 test device neither value was present at all. Do not build fleet remediation on them.
Step two: what is holding the system awake, and what is armed to wake it
These four commands answer the two questions that actually matter. Run them elevated; without administrator rights the request and timer output is incomplete, which is worse than no answer because it looks clean.
The request categories in that output deserve a table, because the names in the tool and the names in the API do not line up perfectly and that trips people up.
| Documented request type | What holding it does | Shown by powercfg as |
|---|---|---|
PowerRequestDisplayRequired | The session display stays on, no screensaver starts, and the session is not auto-locked after inactivity. | DISPLAY |
PowerRequestSystemRequired | "Prevents the computer from automatically entering sleep mode after a period of user inactivity." This is the one drivers are permitted to use. | SYSTEM |
PowerRequestAwayModeRequired | Audio and video are turned off so the machine looks asleep while it keeps running. Documented as "only applicable on Traditional Sleep (S3) systems". | AWAYMODE |
PowerRequestExecutionRequired | The calling process keeps running instead of being suspended or terminated by process lifetime management. Supported from Windows 8 onward. | EXECUTION |
powercfg /requests printed six sections, adding PERFBOOST and ACTIVELOCKSCREEN to the four above. The documented POWER_REQUEST_TYPE enumeration contains exactly four members. Treat the extra two as observed tool output rather than a documented contract, and do not write a parser that hard-fails when the set of headings changes. Also remember that /requests is a snapshot of right now. A requester that only appears at 02:00 will not be there when you look at 10:00.
Step three: the reports that name the offender
The live commands tell you about now. The reports tell you about last night. There are five, all built into powercfg.exe, and each writes a file into the current directory unless you pass /output.
| Command | What the report contains | Where and over what window |
|---|---|---|
powercfg /sleepstudy | The one to run first. Per-session Modern Standby quality: static platform and firmware info, a usage-trend graph, a colour-coded summary table of each state segment with start time, duration, power source and battery consumed, plus for each Sleep session "the five most active components ('top offenders')" with type, name and device path, and an idle-time histogram. Ends with battery configuration including design capacity and cycle count. | Writes Sleepstudy-report.html to the current working directory. Covers the last three days by default; /duration takes up to 28 days. |
powercfg /batteryreport | Battery usage characteristics "over the lifetime of the system". | HTML report in the current path. /duration in days, /output for a path, /xml for XML. |
powercfg /systemsleepdiagnostics | "A report of intervals when the user was not present over the last three days on the system, and if the system went to sleep." Exactly the report for "did it even try to sleep last night". | HTML in the current path. Documented as requiring administrator privileges and an elevated prompt. |
powercfg /systempowerreport (/spr) | System power transitions over the last three days "including connected standby power efficiency". This is where the "Networking in standby" field lives that tells you whether apps were connected during sleep. | HTML in the current path. Requires an elevated prompt. |
powercfg /srumutil | "Enumerates the entire Energy Estimation data from the System Resource Usage Monitor (SRUM)" as XML or CSV. Per-app energy attribution rather than per-session. | File you name with /output, formatted with /xml or /csv. |
powercfg /energy | Analyses the system "for common energy-efficiency and battery life problems". Should be run on an idle machine with nothing open. | HTML in the current path. /duration in seconds, default 60. |
How to read a sleepstudy summary table without a manual: the rows are colour-coded, and the thresholds are documented. For a Sleep session, red means the DRIPS rate is under 80 percent or the drain rate is at or above 1 percent per hour. Yellow means DRIPS between 80 and 94 percent, or drain between 0.33 and 1 percent per hour. Green is everything else. Sessions under two minutes show no detailed data. Overall sessions shorter than ten minutes are not tracked at all, so a five-minute lid-close test tells you nothing.
Step four: the event log
Two providers matter, both writing to the plain System log. There is no dedicated operational channel for power on Windows client.
Microsoft does not publish a consolidated Event ID reference page for Microsoft-Windows-Kernel-Power on Windows client. So rather than invent meanings, the message strings below were read directly from the provider's own manifest on a Windows 11 build 26200 device using wevtutil gp Microsoft-Windows-Kernel-Power /ge:true /gm:true, and cross-checked against real records in the System log on that device. That is the authoritative source for the string; it is not a documented contract, so do not treat the IDs as a stable API.
| Event ID | Message text from the provider manifest | How to use it |
|---|---|---|
| 42 | "The system is entering sleep." The record carries a Sleep Reason. On the test device the observed reason was Battery. | Confirms an attempt to sleep happened at all, and why. Absence of 42 and 506 across a whole night is itself the finding. |
| 107 | "The system has resumed from sleep." | Pairs with 42. Count the pairs to count the night's transitions. |
| 187 | "User-mode process attempted to change the system state by calling SetSuspendState or SetSystemPowerState APIs." | The one to look for when something in user mode is forcing transitions. Note: this ID was present in the provider manifest but had zero records on the test device, so absence is normal. |
| 506 | "The system is entering Modern Standby" plus a Reason. On the test device an observed reason was AC/DC Display Burst Suppressed. | The Modern Standby-specific entry event. This is the one to count for "how many standby sessions were there". |
| 507 | "The system is exiting Modern Standby" plus a Reason. An observed reason on the test device was Input Mouse. | The single most useful ID on this topic. The reason string maps to the documented sleepstudy exit-reason list, so a run of 507s with a non-user reason is your drain cause. |
| 172 | "Connectivity state in standby: %1, Reason: %2". Observed on the test device as Connected, Reason: None. | Tells you whether the session was actually connected, which is the Adaptive Connected Standby decision made visible. |
The second provider is the useful one for a single question: what woke it.
The fix: policy the wake surface, not the sleep state
You cannot change the sleep model. So everything you can actually do falls into three buckets: stop things holding power requests, stop things arming wake timers, and set the timeouts sensibly. All three are configurable, and all three have both a Group Policy and an Intune path.
The registry surface, and an honest caveat about it
Most power configuration is not registry-first. Power schemes, subgroups and settings are addressed by GUID through powercfg and the power API, and Microsoft's own guidance for reading and writing them is powercfg /query, /setacvalueindex and /setdcvalueindex, not registry editing. There is no documented registry key that holds "the current sleep timeout" for you to read.
What is documented is the policy side. Every ADMX-backed power policy states its registry key and value name, so the following table is a genuine documented reference rather than a reverse-engineered one. All of these hang off one parent key.
| Setting GUID subkey | Policy it backs | Value names |
|---|---|---|
29F6C1DB-86DA-48C5-9FDB-F2B67B1F44DA | Specify the system sleep timeout (plugged in / on battery). Value is seconds. | ACSettingIndex, DCSettingIndex |
7bc4a2f9-d8fc-4469-b07b-33eb785aaca0 | Specify the unattended sleep timeout. Documented: 0 seconds means Windows does not automatically transition to sleep. | ACSettingIndex, DCSettingIndex |
9D7815A6-7EE4-497E-8888-515A05F02364 | Specify the system hibernate timeout. Value is seconds. | ACSettingIndex, DCSettingIndex |
A4B195F5-8225-47D8-8012-9D41369786E2 | Allow applications to prevent automatic sleep. This is the power-request lever. | ACSettingIndex, DCSettingIndex |
f15576e8-98b7-4186-b944-eafa664402d9 | Allow network connectivity during connected-standby. | ACSettingIndex, DCSettingIndex |
abfc2519-3608-4c2a-94ea-171b0ed546ab | Allow standby states (S1-S3) when sleeping. Note the S1-S3 in the name; on a Modern Standby device this is not your lever. | ACSettingIndex, DCSettingIndex |
5CA83367-6E45-459F-A27B-476B1D01C936 | Select the lid switch action. Documented values: 0 no action, 1 sleep (default), 2 hibernate, 3 shutdown. | ACSettingIndex, DCSettingIndex |
7648EFA3-DD9C-4E3E-B566-50F929386280 | Select the Power button action. Same four documented values. | ACSettingIndex, DCSettingIndex |
3C0BC021-C8A8-4E07-A973-6B14CBCB2B7E | Turn off the display, in seconds. | ACSettingIndex, DCSettingIndex |
0e796bdb-100d-47d6-a2d5-f7d2daa51f51 | Require a password when a computer wakes. | ACSettingIndex, DCSettingIndex |
Two more documented registry facts sit outside that parent key and are worth knowing.
DesignCapacityOfLow reported in the ACPI _BIX control method. Take that away and a deep drain becomes an unclean power loss instead of a clean hibernate. Equally, setting "Allow wake timers" to Disable fleet-wide will silently break every maintenance window, patch install and inventory task that relies on waking a device. Fix the specific requester you found in /waketimers instead.
Group Policy: the exact click path
Every setting in the table above lives in Power.admx, under one branch. Here is the full path and the walkthrough.
- Open the Group Policy Management Editor on your policy, or
gpedit.mscfor a local test. - Navigate to Computer Configuration > Administrative Templates > System > Power Management > Sleep Settings.
- Open Allow applications to prevent automatic sleep (on battery). Read the help text carefully before choosing. Enabling this policy means "any application, service, or device driver prevents Windows from automatically transitioning to sleep". Disabling it is the restrictive choice: only user input then determines whether Windows sleeps. Set it to Disabled if you want to neutralise misbehaving power requests, and set the plugged-in twin the same way.
- Open Specify the system sleep timeout (on battery) and set a value in seconds. Do the same for the plugged-in variant.
- Open Specify the unattended sleep timeout (on battery). This is the one that governs sleep when nobody is at the machine. Remember that 0 seconds means Windows will never automatically sleep.
- If you need connectivity behaviour pinned rather than left to Adaptive Connected Standby, open Allow network connectivity during connected-standby (on battery) and (plugged in). Enabled maintains connectivity in standby. Disabled means connectivity "isn't guaranteed", and the documentation adds that the restriction "currently applies to WLAN networks only, and is subject to change".
- For the lid and buttons, move up one level to Power Management > Button Settings and set Select the lid switch action and Select the Power button action.
- Close the editor and run
gpupdate /target:computer /forceon a test device, then re-runpowercfg /q SCHEME_CURRENT SUB_SLEEPand confirm the indexes changed.
f15576e8-98b7-4186-b944-eafa664402d9, whose provisioning alias is Common\Power\Policy\Settings\Misc\ConnectivityInStandby, is documented as available "in Windows Vista through Windows 10, version 1909" and "Deprecated starting in Windows 10, version 2004". The ADMX-backed policy that writes the same GUID under Software\Policies is documented as applying to Windows 11 21H2 and later. Those two pages disagree in spirit, and 2004 is also the release where Adaptive Connected Standby became the default. Test the outcome on your actual build rather than assuming the policy still overrides ACS.
Intune: the settings catalog path
There is no separate Intune template for power. These settings come through the settings catalog, generated from the Policy CSP, so you build a settings catalog profile and pick them out of the picker.
- Sign in to the Microsoft Intune admin center with an account holding at least the Policy and Profile Manager built-in role.
- Select Devices > Manage devices > Configuration > Create > New policy.
- Set Platform to Windows 10 and later and Profile type to Settings catalog. Select Create.
- Name it something a future you will recognise, such as
Win11: Modern Standby power baseline. Select Next. - On Configuration settings, select Add settings, then type
sleepin the search box. The picker returns the Power category for the Policy CSP settings and the Administrative Templates categories for the ADMX-backed ones. - From the Power category, add Standby Timeout On Battery, Standby Timeout Plugged In, Unattended Sleep Timeout On Battery and Select Lid Close Action On Battery. The tooltips link straight to the CSP page for each one.
- Search again for
connected-standbyand add Allow network connectivity during connected-standby for both power sources if you are pinning that behaviour, andprevent automatic sleepfor the power-request lever. - Set each value. Close the picker, select Next, add scope tags if you use them, then assign to a small pilot group first.
- On Review + create, select Create. After the next device check-in, verify on a target device with
powercfg /q SCHEME_CURRENT SUB_SLEEPand by reading the policy registry key from the table above.
If you need the raw OMA-URIs for a custom profile or another MDM, these are the documented ones.
| Policy | OMA-URI | Format |
|---|---|---|
| System sleep timeout, on battery | ./Device/Vendor/MSFT/Policy/Config/Power/StandbyTimeoutOnBattery | ADMX-backed, chr |
| Unattended sleep timeout, on battery | ./Device/Vendor/MSFT/Policy/Config/Power/UnattendedSleepTimeoutOnBattery | int, range 0 to 4294967295 |
| Lid close action, on battery | ./Device/Vendor/MSFT/Policy/Config/Power/SelectLidCloseActionOnBattery | int, 0 to 3 |
| Allow applications to prevent automatic sleep, on battery | ./Device/Vendor/MSFT/Policy/Config/ADMX_Power/AllowSystemPowerRequestDC | ADMX-backed, chr |
| Network connectivity during connected-standby, on battery | ./Device/Vendor/MSFT/Policy/Config/ADMX_Power/DCConnectivityInStandby_2 | ADMX-backed, chr |
| Specify a custom active power plan | ./Device/Vendor/MSFT/Policy/Config/ADMX_Power/CustomActiveSchemeOverride_2 | ADMX-backed, chr, takes a scheme GUID |
| Allow hibernate | ./Device/Vendor/MSFT/Policy/Config/Power/AllowHibernate | int, 0 or 1, default 1 |
powercfg /hibernate off, or setting HibernateEnabled to 0 under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power. If an old build task or an OEM image ran powercfg /h off, your Intune policy will report success and change nothing. Check the device, not the report.
Defender and security policy: mostly N/A, with one real exception
There is no Defender profile, no attack surface reduction rule, no exploit protection mitigation and no WDAC or firewall setting that governs Modern Standby. If you were expecting an Endpoint Security profile in this post, there genuinely is not one, and saying so is more useful than inventing a link.
The one real intersection is virtualization-based security. Look again at the powercfg /a output earlier in this post: against Standby (S3) the device reported "The current Device Guard configuration has disabled this standby state", and against Hybrid Sleep it reported "The hypervisor does not support this standby state". On a device with VBS or Credential Guard enabled, your security baseline is one of the things removing legacy sleep states from the menu. That is worth knowing before someone spends a week trying to "re-enable S3" on a hardened fleet.
Proof it worked: a real run on a Modern Standby laptop
The companion script for this post pulls the whole first pass into one read-only report: supported sleep states and the standby variant, the active scheme and its sleep subgroup indexes, current power requests, armed wake timers and wake-armed devices, battery full-charge versus design capacity, the policy registry key, and a count of the sleep and wake events. It changes nothing. It does not even generate a report file, precisely so it can be run against a user's machine during a call without leaving anything behind.
Script: Get-ModernStandbyDrainReport.ps1
Repo: github.com/Imran76Awan/Windows-11-Scripts › modern-standby-power-plan-battery-drain
Read-only. ASCII only. Zero parse errors on Windows PowerShell 5.1 and PowerShell 7. Requires elevation, and refuses to run without it rather than under-report what is holding the machine awake.
Here is a genuine run on the Windows 11 Enterprise build 26200 test laptop, with the computer name and one scheduled task name replaced. Output is abridged to the sections that carry the verdict.
Read that exit code as the feature it is. Exit 0 means every read succeeded. Exit 2 means the report printed but at least one field is genuinely unknown, so you should not tick the box. Exit 1 means a critical read failed, or the session was not elevated, and the script aborted rather than tell you that nothing is holding the machine awake when it simply could not look.
Closing the loop with the built-in reports
Once the script has told you the sleep model and pointed at a suspect, run the two reports it deliberately does not generate. Do it in a directory you chose, from an elevated prompt, because both write files.
The order matters. Sleep model, then live requests and timers, then the per-session report, then per-app energy. Every step narrows the suspect list from a whole machine to one component with a name you can act on. That is the whole difference between "the laptop drains overnight" and "the nightly inventory task arms a wake timer at 02:09 and the machine never gets back to DRIPS afterwards".
References
Microsoft-official sources for everything asserted above.
- Modern Standby - the definition, the relationship to Connected Standby, and the statement that the power model cannot be switched without an OS reinstall.
- System power states - the ACPI state table, the S0 low-power idle row, and the caution against legacy S3 Wake-on-LAN on Modern Standby systems.
- Overview of Modern Standby Validation - how to use
powercfg /ato identify Modern Standby, and the exact Network Connected versus Network Disconnected output. - Powercfg command-line options - every option, argument and output file referenced in this post.
- Modern standby SleepStudy - report contents, colour-coding thresholds, offender types and the exit-reason table.
- Prepare software for modern standby - the phase chain and the five-minute DC power-request block.
- Modern Standby states - Screen Off versus Sleep, and DRIPS.
- Modern Standby Wake Sources - the wake source tables and the Windows 11 24H2 excessive-drain behaviour.
- Network connectivity - Adaptive Connected Standby and the "Networking in standby" field in the system power report.
- POWER_REQUEST_TYPE - the four documented power request types and their effects.
- Power Policy CSP and ADMX_Power Policy CSP - OMA-URIs, ADMX mappings, GPO paths and registry key names.
- Create a policy using settings catalog in Microsoft Intune - the admin center navigation used above.
Community deep-dives, both fetched and confirmed on topic before citing.
| Author | Post | Why it is worth reading |
|---|---|---|
| Rudy Ooms (call4cloud.nl) | Three Intune Power Settings outside Ebbing Missouri | Walks three practical ways to deliver power configuration from Intune: a PowerShell script wrapping powercfg, a registry-based Win32 app, and the settings catalog. Useful when the catalog does not expose the exact knob you need. |
| Maurice Daly (MSEndpointMgr) | Proactive Battery Replacement with Endpoint Analytics | Uses powercfg /batteryreport and the design-capacity versus full-charge-capacity ratio as a fleet-scale battery replacement signal, which is the reporting side of the battery section above. |
Download it from Imran76Awan/Windows-11-Scripts — no sign-in required. It is read-only: it reports and never changes a device or anything in Intune. Validate it in your own environment before relying on the output.