快速启动的真面目 ── Windows 的「关机」为什么和重启不一样
· 更新日期: · Go Komura · Windows, 快速启动, 关机, 电源管理, IT 部门, 设备用 PC, PowerShell, Windows 开发
「关机之后断电再通电,打印机还是认不出来。可是一重启就好了」
理解这个差别的钥匙,就是 Windows 的快速启动。在 Windows 8 以后,支持休眠且启用了这个功能的电脑上,「关机」并不是把 Windows 的状态全部重新构建的操作。应用与用户会话会关闭,但内核、驱动程序、服务的状态会被保存下来,并在下次启动时还原。这称为混合关机。12
另一方面,「重启」与快速启动的设置无关,始终执行完整的引导周期。「断电再通电」和「重启」并不是同一个操作。1
本文先给出操作的选法,再讲它的理由、按症状的排查、确认方法,最后是设置变更的判断。API 与 Windows 服务在实现上需要注意的地方整理在第 7 章。对象是管理 Windows 10/11 的 IT 部门人员,以及面向设备用 PC・验证机的 Windows 应用开发者。确认与设置使用 PowerShell 5.1 及以上。
1. 先说结论:选择符合目的的操作
在直接关掉快速启动之前,请先分清你想做什么。
| 目的・困扰 | 首先选择的操作・对应 | 详细说明 |
|---|---|---|
| 想排查问题、想把 Windows 的状态重置一次 | 重启。但不要仅凭好了就断定原因 | 3.1・4.1 |
| 想完全结束 Windows 并切断电源 | 执行 shutdown /s /t 0 |
3.2 |
| 想让待处理的更新完成 | 选择「更新并重启」 | 4.3 |
| 想在夜间用 Wake on LAN 唤醒 | 不是快速启动的开关,而是重新审视待机的电源状态 | 4.4 |
| 想做到每次「关机」都会初始化 | 确认终端的角色之后,再考虑停用快速启动 | 第 6 章 |
flowchart TB
accTitle: 电源菜单的三个操作与实际发生的事
accDescr: 关机默认会变成混合关机,把内核保存到休眠文件。重启始终执行完整的引导周期。休眠会连用户会话一起保存到休眠文件。
shutdown["关机"] --> hybrid["混合关机(默认)"]
hybrid --> saveKernel["把内核保存到休眠文件"]
restart["重启"] --> full["完整的引导周期"]
full --> reinit["重新构建内核・驱动程序・服务"]
hibernate["休眠"] --> s4["休眠(S4)"]
s4 --> saveAll["保存整个内存"]
图 1:「关机」保存状态,「重启」重新构建 Windows 一侧的状态。通常的休眠连用户会话一起保存。即使重启,所连接设备的电源也不会被切断。
「重置一次」和「改变每次的结束方式」是两个不同的判断。一般的业务用笔记本电脑保持开启,需要时重启才是现实的做法。Microsoft 也不推荐一律停用快速启动。1
图中实线表示始终成立的关系,虚线表示带条件的关系(成立条件写在详情页各关系的说明中)。关系的完整列表(共 24 条,附依据与确信度)以及主要概念的定义,汇总在知识地图详情页(日文)。数据:JSON-LD / Turtle
2. 机制:Windows 的状态「不重新构建而是还原」
2.1 与完全关机的分岔点
Windows 的启动有三种模式:传统的冷启动、从休眠恢复,以及 Windows 8 引入的快速启动。冷启动时,引导加载程序把内核读入内存并链接,内核配置核心功能、枚举已连接的设备并加载驱动程序。快速启动则改为从休眠文件把已初始化的状态读回来。5
为读回来所做的准备,是在上一次关机时进行的。关闭应用、注销所有用户这一段与完全关机相同。之后就分岔了。51
| 阶段 | 完全关机 | 混合关机 |
|---|---|---|
| 应用・用户会话 | 关闭应用,注销所有用户 | 同左 |
| 内核会话 | 关闭 | 不关闭而是让它休眠 |
| 切断电源前的处理 | 结束系统 | 向驱动程序发送准备休眠的电源 IRP,把包含内核模式驱动程序的内存映像保存到 hiberfil.sys |
| 下次通电时 | 初始化内核・驱动程序等 | 把保存的状态读回来并恢复 |
驱动程序收到的也不是结束的通知,而是告知进入休眠的电源 IRP。在用户看来是断电,但 Windows 的核心部分并没有结束,而是被保存到了下次启动。5
2.2 被保存的与被关闭的
分界在用户会话(会话 1 以后的交互会话)与内核会话(会话 0)之间。62
| 对象 | 混合关机时的处理 |
|---|---|
| 打开着的应用、登录状态 | 随用户会话的注销而结束 |
| 每用户服务(per-user service) | 在注销时停止并删除 |
| 内核、已加载的内核模式驱动程序 | 把状态保存到休眠文件,下次启动时还原 |
| 会话 0 的系统服务 | 不是停止再重新启动,而是保持状态休眠并还原 |
每用户服务与会话 0 的服务,虽然同样叫「服务」,处理却不同。前者在登录时创建、注销时停止并删除,因此不会被带过去。7
反过来,被保存的一侧会留下驱动程序的内部状态,以及系统服务持有的句柄、内存、内部缓存。Microsoft 面向硬件的文档也说明,内核、驱动程序、服务是被保存并还原而不是被重启,因此内核两次启动之间的运行时间可能比以前的 Windows 更长,并要求监视驱动程序与服务的内存泄漏。2
2.3 与通常休眠的区别
通常的休眠会保存包含用户会话在内的整个内存。快速启动则是在注销用户之后再保存。因此休眠文件更小,写出与读回也更快。26
用电源状态的术语来说,完全关机是 S5,休眠是 S4。混合关机在用户看来像 S5,实际上却经由 S4。不过对设备唤醒警报的响应会按 S5 来处理。同样是 S4,也不会与通常的休眠在所有行为上一致,这个差别与 4.4 的 Wake on LAN 有关。6
2.4 下次启动是「恢复」而不是「初始化」
从快速启动的启动会依次经过固件初始化、读取休眠文件、恢复设备、恢复 Winlogon、初始化 Explorer。休眠文件中保存着关机时写出的系统上下文。8
这里重要的是,设备是被恢复而不是被初始化。如果驱动程序内部本来就带着「识别不到外设」「USB 设备恢复后没反应」这类异常状态,那么这个状态也可能被带过去。
「重启」不走这条保存・还原的路径,始终经过完整启动。安装驱动程序之后,或者更新了没有完整重启就无法替换的 Windows 组件之后需要重启,也是为了重新构建 Windows 一侧的状态。1
3. 不改设置也能重置・完全关机
3.1 想重置后继续用就选「重启」
排查问题,或者想把 Windows 一次性恢复到干净状态时,请在电源菜单中选择「重启」。因为它不依赖快速启动的设置,所以在操作手册里写这个操作最保险。1
不过,重启是完整的引导周期,并不是让电脑停在断电状态(S5)的操作。在从别的操作系统处理磁盘之前等需要完全结束 Windows 并切断电源的场合,请使用下面的方法。
3.2 要连电源一起切断就用 shutdown /s /t 0
保存好工作之后,执行下面的命令。
shutdown /s /t 0
Shutdown.exe 的 /s 默认是完全关机。只有想要混合关机时,才把 /hybrid 与 /s 组合。 电源菜单的「关机」与命令的 /s,默认行为是不同的。19
在设备用 PC 的结束处理或批处理中,这条命令也能明确表达「完全结束并切断电源」的意图。另外,/g 是完全关机后再重启、并在启用了自动重启登录(ARSO)时恢复已注册应用的选项,不是让电源保持切断的指定。9
3.3 使用 Shift 键的方法,以及从应用调用的方法
按住 Shift 键的同时选择「关机」,就只有这一次会变成完全关机。不过这不是官方参考文档,而是 Microsoft Q&A 的支持回答中介绍的做法。用于运营时请用第 5 章的运行时间或事件 27 确认结果;给用户的操作手册上,从可靠性来说写「重启」或 shutdown /s /t 0 更稳妥。10
也可以从应用用 API 执行完全关机。例如把 InitiateSystemShutdownEx 的 bRebootAfterShutdown 设为 FALSE 的方法。各 API 的标志、关闭电源与重启的区别、所需特权整理在第 7 章。11
4. 按症状排查原因
到这里的机制已经能解释运行时间和问题的带入。不过,不要把眼前的症状一概归咎于快速启动。尤其是 Wake on LAN,要作为另一个限制来区分。
4.1 关机解决不了、重启就好了
首先要做的是确认重启之后是否仍会重现。 如果重启后消失,那么「驱动程序或服务被带过来的状态是原因」这个假设就更有力。
不过,仅凭重启后好了并不能确定。也可能是间歇性的问题碰巧没出现,也可能是重启让待处理的更新完成了。在把它当作原因之前,要取得下面的佐证。
- 多次确认「关机后会重现、重启后不重现」。
- 用第 5 章的 Kernel-Boot 事件 27 确认最近一次启动是快速启动(
0x1)。 - 与设备管理器或系统日志中驱动程序一侧的记录相互对照。
即使取得了佐证,也不必马上改所有终端的设置。多数情况下,把操作手册里的「断电再通电」改成「重启」就够了。是不是需要保证每次结束时都初始化的终端,在第 6 章判断。
关机本身失败、回到锁屏的情况需要另外确认。启用了快速启动的关机是作为休眠处理执行的,其过程中会初始化内存转储的配置。如果无法加载转储筛选器的驱动程序,休眠就会失败,记录事件 ID 45 并回到锁屏。Microsoft 给出的确认位置是 HKLM\SYSTEM\CurrentControlSet\Control\CrashControl 的 DumpFilters。把这个症状理解为「休眠的失败」而不是「关机的失败」,要查的地方就明确了。1
4.2 每晚关机,运行时间却不重置
任务管理器的「性能」>「CPU」有时会显示好几天的运行时间。混合关机只是让内核休眠再还原,所以内核的启动时刻不会更新。2
在 WMI 中使用 Win32_OperatingSystem.LastBootUpTime,用当前时间减去启动时刻来求运行时间。经过完整启动的重启,或者完全关机之后的启动,会更新这个作为基准的启动时刻。12
PowerShell 6 及以上的 Get-Uptime 使用高分辨率计时器自系统启动以来的滴答数。因此与从 WMI 求得的值可能略有不同,但以内核启动为基准这一点是相同的。13
不要仅凭运行时间长就断定是故障或快速启动。 睡眠、显式的休眠、未完成的关机之后,运行时间同样会保持。请在确认事件 27 与周边日志之后再作说明。
另外,「运行时间超过 30 天就提示重启」这类监视,对每天关机的用户也会发出警告。这并不是监视错了。把通知文案写成「请重启」,就能避免「我昨晚明明关机了」的困惑。
4.3 选了「更新并关机」,更新却没结束
想让更新结束时,请选择「更新并重启」。 Microsoft 的支持信息(KB4011287)说明,一部分更新只有在完全关机之后的启动中才能完成,经由快速启动的休眠时可能被保留。这个行为在重启时不会发生。3
「更新并关机」之后,第二天早上又出现「正在更新」,多半不是更新失败,而是原本等待完整启动的处理在那次启动中推进了而已。如果已经停用了快速启动,那么「更新并关机」也会经过完整启动,前提就不同了。
同一份支持信息中还记载,在用 Configuration Manager 管理的环境中更新完成的延迟,已在 Configuration Manager 2002 与 Windows 10 21H1 中得到处理。3
4.4 无法用 Wake on LAN 唤醒关机的电脑
这个问题仅靠关掉快速启动是解决不了的。 在 Windows 10/11 上,无论是混合关机还是完全关机(S5),作为 Windows 的 Wake on LAN(WOL) 都不受支持。414
| 待机状态 | 作为 Windows 的 WOL 的处理 |
|---|---|
| 传统的睡眠(S3) | 受支持的路径。不过取决于网卡与唤醒设置 |
| 用户显式选择的休眠(S4) | 受支持的路径。不过取决于网卡与唤醒设置 |
| 混合关机(实体是 S4) | 网卡不会被准备成可唤醒状态,不受支持 |
| 完全关机(S5) | 不受支持 |
| Modern Standby(S0 低功耗空闲) | 网络可能成为唤醒源,但需要确认机型与电源条件 |
同样是 S4,「休眠」与「关机」在 Windows 中的处理也不同。按 Microsoft 的说明,下达关机指令的用户期待零耗电,所以 Windows 在进入混合关机的转换时不会把网卡准备(arm)成可唤醒状态。而在进入显式休眠的转换中不做这种停用。4
在 Windows 7 上,默认的完全关机(S5)之后的 WOL 官方也是不支持的。不过有些机型因为有残留电力,网卡会保持在已准备唤醒的状态。区别在于,Windows 10 默认的混合关机中,Windows 会显式停用唤醒。4
不能把 Modern Standby 机型一概而论成「睡眠就一定能唤醒」。 powercfg /a 中显示「S0 低电量空闲」的机型没有 S3。在 Modern Standby 中,即使屏幕熄灭系统也在低功耗运行,Wi-Fi、以太网、移动宽带会维持连接并可能成为唤醒源。以太网连接时远程桌面与文件共享可以唤醒 SoC,Microsoft 的资料中也有记载。15
不过同一份资料中还有下面这些条件。15
- 在断开连接的待机中应用无法使用网络,用电池运行时网络堆栈可能开始断开。
- 有线局域网如果不支持模式匹配的卸载,就不会成为 Modern Standby 兼容。
- Windows 11 version 24H2 及以后,检测到电池消耗过度时会停用许多唤醒源。
在 Surface 上,据称从 Windows 10 version 1607 起 Modern Standby 中的 WOL 默认可用,但这并不能保证其他厂商的笔记本电脑。实际能否唤醒取决于网卡、固件、AC/DC 的电源条件与 OEM 的实现,所以在纳入夜间作业等无人运营之前请在实际设备上确认。16
另外,也有一些机型的固件与硬件能自行把网卡准备成从 S4/S5 唤醒的状态。这种情况下 Windows 不参与。「有些机型能从关机状态唤醒」说的就是这个例外。4
在运营上,基本做法是让想唤醒的终端以「睡眠」或「休眠」待机。即使正确设置了网卡的「Wake on Magic Packet」等,只要操作系统的电源转换停用了唤醒,就唤不醒。驱动程序一侧的区分方法在 7.5 说明。Modern Standby 的行为请参见「睡眠、休眠、Modern Standby 与长时间运行应用」,网卡的设置请参见「Windows 网卡高级设置指南」。
4.5 双系统或从别的操作系统处理同一块磁盘
本节是基于电源状态的一手信息,从机制推导出的注意事项。混合关机会保存内核的内存映像,并在下次启动时还原。6
进入休眠时待处理的写入会落到磁盘,但文件系统驱动程序的缓存以及关于卷结构的前提仍留在休眠文件里。在这期间如果别的操作系统(Linux 或 Windows PE 等)向同一个 NTFS 卷写入,那么下次 Windows 还原的旧认知就与磁盘的实体不一致了。
危险的不是休眠本身,而是别的操作系统改写之后,Windows 还原了旧状态。Linux 一侧的 NTFS 驱动程序拒绝向处于休眠状态的卷写入,或者以只读挂载,正是为了防止这种不一致的正确行为。
在多个操作系统共用同一块磁盘的终端,或者会从修复用的别的操作系统启动的验证机上,请把下面二者之一纳入运营。
- 关掉快速启动,并用
powercfg /h off把显式的休眠也一并停用。 - 在切换操作系统之前,把第 3 章的完全关机设为必做。
只关掉快速启动,显式的休眠仍然留着。休眠状态下从别的操作系统写入,同样会产生不一致,请注意这一点。
4.6 固件设置或设备配置的更改没有生效
明明改了 UEFI 设置或外设的配置,断电再通电后却像是仍留着以前的状态,这时请重启以经过完整启动。因为在快速启动中,驱动程序走的是恢复而不是冷启动时的初始化路径。
Microsoft 要求那些在冷启动与休眠恢复时改变设备配置的驱动程序,在快速启动之后按冷启动来配置。对于没有这样实现的驱动程序,恢复路径就会成为问题。驱动程序一侧的判别方法整理在 7.5。5
5. 把「设置」与「实际的启动路径」分开确认
即使快速启动处于启用的设置,最近一次启动也未必走的是那条路径。要把确认设置的信息与确认启动结果的信息分开来读。
5.1 确认的位置有 4 个
| 确认位置 | 能知道的 | 注意事项 |
|---|---|---|
| 任务管理器的运行时间 | 内核启动以来时间是否在延续 | 最初的线索。睡眠・休眠・关机失败时也会延续,单独不能断定 |
| 系统日志的 Kernel-Boot、事件 ID 27 | 最近一次启动的种类 | 与运行时间对照,确认实际的路径 |
powercfg /a |
可用的电源状态、休眠文件的有无与种类 | 在缩小休眠文件下,即使不能用通常的休眠也能用快速启动 |
本地与策略的 HiberbootEnabled |
快速启动的设置 | 策略的 0 不是「强制停用」的意思 |
运行时间的思路见 4.2,休眠文件与设置的关系在 6.3・6.4 也会说明。261718
5.2 事件 27 的读法
Kernel-Boot 的事件 27 会在启动时记录「引导类型为 0x1」这样的值。值的含义在官方参考文档中没有记载,但下面的对应关系广为人知。
| 值 | 启动的种类 |
|---|---|
0x0 |
完整启动 |
0x1 |
快速启动 |
0x2 |
从休眠恢复 |
即使运行时间在延续,只要最近的值是 0x2,那就是从通常的休眠恢复,而不是快速启动。不要只用运行时间来解释,要与事件 27 结合起来看。
5.3 用 PowerShell 一次性确认
下面的脚本会一次性显示设置、休眠文件、运行时间以及最近 5 次启动的种类。读取注册表与事件日志大多不需要管理员权限也能运行,但 powercfg /a 在有些环境下会要求管理员权限。
# 一次性显示快速启动的设置与最近启动的种类
$powerKey = 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power'
$policyKey = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\System'
$local = Get-ItemProperty -Path $powerKey -Name HiberbootEnabled -ErrorAction SilentlyContinue
$policy = Get-ItemProperty -Path $policyKey -Name HiberbootEnabled -ErrorAction SilentlyContinue
$os = Get-CimInstance -ClassName Win32_OperatingSystem
$hiberfil = Test-Path -LiteralPath "$env:SystemDrive\hiberfil.sys"
# 没有休眠文件(powercfg /h off)时,无论注册表的值如何,快速启动都不会工作。
# 策略「要求使用快速启动」只有在启用(1)时才优先于本地设置。
# 策略值为 0 或未配置时使用本地设置(无值时默认为启用)
$effective =
if (-not $hiberfil) { '不可用(无休眠文件: powercfg /h off 的状态)' }
elseif ($null -ne $policy -and $policy.HiberbootEnabled -eq 1) { '启用(由策略强制)' }
elseif ($null -eq $local -or $local.HiberbootEnabled -eq 1) { '启用(本地设置)' }
else { '停用(本地设置)' }
[pscustomobject]@{
LocalHiberbootEnabled = if ($null -eq $local) { '(无值: 默认为启用)' } else { $local.HiberbootEnabled }
PolicyHiberbootEnabled = if ($null -eq $policy) { '(未配置)' } else { $policy.HiberbootEnabled }
EffectiveSetting = $effective
HiberfilExists = $hiberfil
LastBootUpTime = $os.LastBootUpTime
Uptime = (Get-Date) - $os.LastBootUpTime
} | Format-List
# 最近 5 次启动的种类(0x0=完整启动、0x1=快速启动、0x2=从休眠恢复)
Get-WinEvent -FilterHashtable @{ LogName = 'System'; ProviderName = 'Microsoft-Windows-Kernel-Boot'; Id = 27 } -MaxEvents 5 |
Select-Object TimeCreated, Message
# 可用的睡眠状态与休眠文件的种类
powercfg /a
这里显示的实效设置,按有没有休眠文件、策略是否强制启用、本地设置如何的顺序判断。策略值为 0 或未配置时使用本地设置;没有休眠文件时,无论设置值如何都用不了快速启动。
5.4 「谁请求了结束」要用另外的日志确认
系统日志的事件 ID 1074(User32) 中记录着请求的进程・用户・原因代码,以及被请求的操作(关闭电源、重启等)。不过混合关机与完全关机都会被记录为关闭电源,因此仅凭 1074 无法区分两者。 实际的路径要用下次启动时的事件 27 确认。
意外的停止,要与 41(Kernel-Power) 或 6008(EventLog) 的排列一起排查。19 追查「设备用 PC 早上停了」的步骤在「从应用看到的 Windows 关机」中讲解。
6. 停用快速启动的判断与步骤
6.1 不要一律关掉,按终端的角色来定
Microsoft 把快速启动设为默认启用,并不推荐停用。它有缩短启动时间的好处,在面向硬件的资料中,休眠文件的读写被当作占启动时间约 50% 的重要处理。在一般的笔记本电脑上,没有一律关掉的理由。12
判断的轴有两个:「以断电即初始化为运营前提吗」和「会从别的操作系统改写同一个卷吗」。这两者是独立的。不要因为是设备用 PC 就关掉然后结束确认,还要确认有没有来自别的操作系统的写入。
| 终端的角色・目的 | 推荐的对应 | 理由 |
|---|---|---|
| 设备用 PC・测量用 PC,以断电初始化为运营前提 | 关掉 | 在无法把操作手册改成「重启」的现场,用设置来保证初始化 |
| 验证机・多个操作系统共用同一块磁盘的终端 | 除关掉外还要停用休眠,或把切换操作系统前的完全关机设为必做 | 只停掉快速启动,显式休眠造成的不一致仍会留下(4.5) |
| 想用 WOL 在夜间唤醒的终端 | 重新审视的不是设置而是待机状态 | 关掉也不支持从 S5 的 WOL。Modern Standby 机型需要在实际设备上确认(4.4) |
| 存储较小的终端 | 考虑缩小休眠文件 | 可以在保留快速启动的同时缩小休眠文件(6.4) |
| 一般的业务用笔记本电脑 | 保持开启,需要时重启 | 保住启动的快速,排查用重启就能做 |
| 不关机的常时运行的服务器式终端 | 怎样都行 | 不关机设置就不起作用,重启始终是完整启动 |
6.2 逐台更改:控制面板
Windows 10/11 都一样,更改的位置不是「设置」应用而是控制面板。4
- 打开「电源选项」,选择「选择电源按钮的功能」。
- 项目是灰色时,点击「更改当前不可用的设置」(需要管理员权限)。
- 取消「启用快速启动(推荐)」的勾选。
- 保存更改。
如果项目本身不显示,说明休眠被停用、没有休眠文件。请确认 6.4 的 powercfg /a 与休眠文件的说明。
6.3 给多台设置:区分注册表与策略
本地的设置值是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power 的 HiberbootEnabled(DWORD)。0 为停用、1 为启用,控制面板的复选框也读写这个值。17
# 在以管理员身份打开的 PowerShell 中执行。停用快速启动
$powerKey = 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power'
Set-ItemProperty -Path $powerKey -Name HiberbootEnabled -Type DWord -Value 0
# 读回设置值确认
(Get-ItemProperty -Path $powerKey -Name HiberbootEnabled).HiberbootEnabled
不过,如果「要求使用快速启动」策略是启用的,那么策略优先于本地值。 即使把本地值设为 0、读回也是 0,它仍然是启用的。这种情况下要先把策略改回停用或未配置。18
| 策略的状态 | 结果 |
|---|---|
| 启用 | 要求使用快速启动,并要求休眠处于启用状态。优先于本地设置 |
| 停用・未配置 | 使用本地的 HiberbootEnabled。并不是强制停用快速启动 |
这项策略位于 WinInit.admx 的「计算机配置 > 管理模板 > 系统 > 关机」。写入的位置是 HKLM\SOFTWARE\Policies\Microsoft\Windows\System 的 HiberbootEnabled。在 Intune 中可作为 Policy CSP 的 ADMX_WinInit/Hiberboot 配置。18
要一律下发关闭时,用组策略首选项(Preferences)或 Intune 的配置下发本地的 HiberbootEnabled = 0。要让用户无法关掉、即强制开启时,才启用这项策略。
flowchart TB
accTitle: 快速启动设置的三层
accDescr: 策略「要求使用快速启动」为启用时优先于本地设置成为启用,未配置时使用本地的 HiberbootEnabled。两条路径下只要不存在休眠文件,快速启动都用不了
policy{"策略: 要求使用快速启动"}
policy -->|"启用"| forced["固定为启用(忽略本地设置)"]
policy -->|"停用・未配置"| local{"本地: HiberbootEnabled"}
local -->|"1(默认)"| on["启用"]
local -->|"0"| off["停用"]
forced --> hib{"有休眠文件(hiberfil.sys)吗"}
on --> hib
hib -->|"有(完整或缩小)"| works["快速启动会工作"]
hib -->|"没有(powercfg /h off)"| none["用不了快速启动"]
图 2: 策略是强制开启的设置。下发停用要用本地的注册表值,而两者都在没有休眠文件时用不了快速启动。
更改从下一次关机开始生效。确认时要先做通常的「关机」再通电,看事件 27 是否为 0x0。重启与设置无关地会是完整启动,所以不能用来确认停用。注册表的读回是设置值的确认,事件 27 是实际路径的确认。
6.4 powercfg /h off 与「只关掉快速启动」不同
快速启动使用的是休眠文件 hiberfil.sys 的机制。powercfg /hibernate off(powercfg /h off) 是删除这个休眠文件的操作。不只是快速启动,通常的休眠与混合睡眠也会用不了。206
另一方面,即使把 HiberbootEnabled 设为 0,休眠文件仍会留着。请按目的分清要更改的对象。
| 目的 | 设置・命令 | 保留的功能・失去的功能 |
|---|---|---|
| 只停掉快速启动 | HiberbootEnabled = 0 |
休眠文件保留。若是完整种类则通常的休眠也保留 |
| 缩小文件并保留快速启动 | powercfg /h /type reduced |
缩小休眠文件(默认为物理内存的 20%)。通常的休眠与混合睡眠用不了 |
| 恢复成通常休眠也能用的种类 | powercfg /h /type full |
完整休眠文件(默认为物理内存的 40%)。在存储小于 32GB 的终端上不推荐 |
| 连休眠都不要 | powercfg /h off |
删除休眠文件。快速启动・休眠・混合睡眠全部用不了 |
完整休眠文件支持休眠、混合睡眠与快速启动。不过混合睡眠需要 S3,所以在没有 S3 的 Modern Standby 机型上,即使有完整休眠文件也用不了。缩小休眠文件只支持快速启动。本来就是缩小种类的电脑,只关掉快速启动也不会让通常的休眠或混合睡眠变得可用。6
powercfg /a 的显示也要按这个区别来读。
| 休眠文件 | 关于通常休眠的显示 | 快速启动 |
|---|---|---|
| 完整(full) | 可用 | 可以使用 |
| 缩小(reduced) | 「不支持休眠」 | 可以使用 |
| 无 | 「未启用休眠」 | 不能使用 |
如果 /type reduced 以「参数不正确」失败,是因为休眠文件的大小被手动设成了大于 40%。请先用 powercfg /h /size 0 把大小交回操作系统管理,再重新执行。621
在会从别的操作系统改写同一个卷的终端上,留下的通常休眠同样会产生 4.5 那样的不一致。不要只停用快速启动就结束,请把休眠也停用,或者把切换操作系统前的完全关机设为必做。
7. 面向开发者:关机 API 与服务的注意事项
7.1 API 不只要指定「是不是混合」,还要指定「是哪个操作」
从应用调用的关机 API,其默认行为与电源菜单不同。在 Microsoft 的资料中,InitiateSystemShutdownEx 与 InitiateSystemShutdown 不会变成混合,InitiateShutdown 与 ExitWindowsEx 则用明确的标志来请求混合。26
| API | 切断电源的完全关机 | 快速启动用的关机 |
|---|---|---|
InitiateSystemShutdownEx / InitiateSystemShutdown |
bRebootAfterShutdown = FALSE |
不会变成混合 |
InitiateShutdown |
指定 SHUTDOWN_POWEROFF,不加 SHUTDOWN_HYBRID |
把 SHUTDOWN_POWEROFF 与 SHUTDOWN_HYBRID 组合 |
ExitWindowsEx |
指定 EWX_POWEROFF,不加 EWX_HYBRID_SHUTDOWN |
把 EWX_SHUTDOWN 与 EWX_HYBRID_SHUTDOWN 组合 |
SHUTDOWN_HYBRID 不单独指定,而是与同一张表中的一个以上标志组合。其中会成为快速启动用的关闭电源的,是与 SHUTDOWN_POWEROFF 的组合。EWX_HYBRID_SHUTDOWN 同样不单独使用,而是与 EWX_SHUTDOWN 组合。2223
仅仅去掉混合的标志,并不能决定操作。 还需要下面的区分。112223
| 参数・标志 | 执行的操作 |
|---|---|
bRebootAfterShutdown = TRUE、SHUTDOWN_RESTART、EWX_REBOOT |
重启 |
SHUTDOWN_NOREBOOT |
停下系统,但不切断电源 |
EWX_SHUTDOWN |
把系统停到可以安全断电的状态,但不切断电源 |
ExitWindowsEx 的 uFlags = 0 |
EWX_LOGOFF,也就是注销 |
要在自助终端或设备用 PC 上实现「关闭电源」按钮,就用 bRebootAfterShutdown = FALSE 调用 InitiateSystemShutdownEx,或者用 EWX_POWEROFF 调用 ExitWindowsEx,并且不加混合的标志。重要的不是「不带标志」,而是保留必要的关闭电源指定。
7.2 调用之前,要在正确的令牌上启用特权
无论哪个 API,要关闭本地电脑都需要先用 AdjustTokenPrivileges 启用 SE_SHUTDOWN_NAME 特权。默认情况下已登录的用户可以启用这个特权,但在停用状态下调用时 API 会失败,关机不会开始。1123
要在哪个令牌上启用,因 API 而异。
| API | 启用特权的令牌 |
|---|---|
ExitWindowsEx |
调用进程的令牌。用 OpenProcessToken 打开 |
InitiateSystemShutdown(Ex) / InitiateShutdown |
调用线程的有效令牌。模拟中则是线程令牌,否则是进程令牌 |
没有在模拟的普通桌面应用或自助终端应用没有线程令牌。OpenThreadToken 会以 ERROR_NO_TOKEN 失败,因此要避免在特权仍停用的状态下继续调用。
7.3 想与电源菜单行为一致,就读取实效设置
EWX_HYBRID_SHUTDOWN 是「请求快速启动」的标志,而不是「遵从这台电脑的设置」的标志。23
即使关掉了快速启动,只要休眠文件还在,带着这个标志去请求就等于让应用绕过了用户的设置。在尊重设置的实用工具中,要按与 5.3 脚本相同的规则,确认策略、本地的 HiberbootEnabled 以及休眠文件的有无。
只有在实效设置为启用时,才把 EWX_SHUTDOWN 与 EWX_HYBRID_SHUTDOWN 组合;停用时就选择关闭电源的完全关机。结果用下次启动时的事件 27 确认。
7.4 服务不只要应对停止通知,也要应对电源事件
在混合关机中,用户会话的应用会关闭,但会话 0 的服务是休眠并还原的。每用户服务在注销时停止并删除,这里请区分开。27
进入休眠时通知会先送到应用与服务,然后是驱动程序。重要的是,恢复时驱动程序与服务不是被重新启动,而是回到休眠前的状态。6
Microsoft 评估工具的资料说明,向声明了 SERVICE_ACCEPT_POWEREVENT 的服务串行发送挂起通知,每个服务适用 30 秒的超时,并且从服务的角度看快速启动与休眠是相同的。24
如果服务在保持与设备连接的状态下休眠,而这期间设备一侧断了电,那么第二天早上还原的连接已经不可用了。把善后只放在停止通知里,就处理不了这条路径。
| 路径 | 需要的接受声明 | 服务的处理 |
|---|---|---|
| 重启・完全关机 | SERVICE_ACCEPT_SHUTDOWN / SERVICE_ACCEPT_PRESHUTDOWN |
接到对应的停止通知后结束 |
| 混合关机・休眠 | SERVICE_ACCEPT_POWEREVENT |
接收电源事件,保持状态休眠并还原 |
停止通知是 SERVICE_CONTROL_SHUTDOWN / SERVICE_CONTROL_PRESHUTDOWN。这个处理对于重启与完全关机是必要的,不能去掉。 在保留它的基础上,也要在进入睡眠・休眠与恢复的电源事件中做善后与重新连接。25
两种通知都只会送到做了对应接受声明的服务。没有声明的话,停止时不带通知就结束,混合关机时不带通知就休眠并还原。完全关机之后的启动中会被重新启动的,是启动类型为自动的服务。手动・禁用的服务,如果没有依赖关系、触发器或显式启动就不会回来。具体的电源事件接收方式在「从睡眠恢复后损坏的应用」中讲解。24
7.5 驱动程序可以区分快速启动与通常的休眠恢复
驱动程序可以使用系统的 set-power IRP 中包含的 SYSTEM_POWER_STATE_CONTEXT 来区分两者。5
| 路径 | TargetSystemState |
EffectiveSystemState |
|---|---|---|
| 快速启动 | PowerSystemShutdown |
PowerSystemHibernate |
| 从通常休眠恢复 | PowerSystemHibernate |
PowerSystemHibernate |
系统提供的 NDIS 驱动程序利用这个差别,在快速启动时停用微型端口的唤醒功能,从通常休眠恢复时则不停用。这就是 4.4 中说明的、同样是 S4 而 WOL 处理不同的原因。5
另外,在冷启动与休眠恢复时改变设备配置的驱动程序,在快速启动之后要按冷启动来配置,这是 Microsoft 的指导方针。5
8. 反映到操作手册与监视中
理解了机制之后,就把现场的操作与措辞对齐。
| 运营的场景 | 写进操作手册・通知的内容 |
|---|---|
| 问题的初次排查 | 不是「断电再通电」,而是「重启」 |
| 运行时间超过阈值时 | 「请重启」。说明为什么每天关机也会被警告 |
| 想让更新完成时 | 把「更新并重启」作为标准 |
| 作为设备用 PC 的标准配置停用时 | 把 6.3 的注册表设置纳入装机,并用第 5 章的方法对通常关机后的启动做验收确认 |
明确写「重启」,对于避免现场用长按电源按钮强制断电也很重要。按运行时间的监视可以照旧使用。因为它正确地检测出了在快速启动的终端上内核没有被重启。
即使重启后问题消失,也要取得 4.1 的重现确认与日志佐证,再反映到步骤或设置中。如果重启也解决不了,就去追查快速启动以外的原因。更新与设备用 PC 应用的关系请参见「从应用看到的 Windows 关机」。3
9. 总结
要记住的是,启用了快速启动的「关机」是用户看到的断电,而不是把 Windows 的状态全部重新构建的操作。应用与用户会话会关闭,但内核、驱动程序、会话 0 的服务是被保存并还原的。52
在关掉了快速启动的电脑,或没有休眠文件的电脑上,通常的「关机」同样会关闭内核会话并进入 S5。
想重置一次就选重启,想完全结束并切断电源就选 shutdown /s /t 0。不要仅凭重启后好了就断定原因,要用重现确认以及事件 27 与周边日志来佐证。19
是否关掉快速启动,按是不是以初始化为前提的终端和是不是会从别的操作系统改写同一个卷的终端来判断。对于后者,还需要针对显式休眠的对策。如果目的是 WOL,那要重新审视的不是设置的开关,而是待机状态。17204
相关文章
- 从应用看到的 Windows 关机 ── 正确扛住退出通知、重启与断电
- 从睡眠恢复后损坏的应用 ── Windows 电源事件机制与扛得住恢复的业务应用
- 睡眠、休眠、Modern Standby 与长时间运行应用 ── 用设计防止「夜里意外停止」
- Windows 的效率模式是什么 - Windows 11 绿色叶子图标代表什么,以及如何关闭
- Windows 网卡高级设置指南 - RSS/LSO/EEE/Wake on LAN
- WSUS 弃用后的 Windows Update 管理 ── 如何选择 WUfB・Autopatch・Intune
- 工业用 PC 应该安装哪种 Windows ── Windows IoT Enterprise / LTSC 实践指南
- Windows 服务的创建与运维 ── 从任务计划程序的取舍到 BackgroundService 服务化
相关的咨询领域
小村软件有限公司承接包含设备用 PC・自助终端的电源运营(关机・睡眠・休眠・Wake on LAN)在内的装机标准设计,「只有重启才能解决」「早上停了」这类长期运行应用问题的原因调查,以及 Windows 服务与常驻应用的电源事件应对的设计评审。哪怕只是「明明关机了运行时间却不减少」这一件事,也欢迎来咨询。
参考链接
-
Microsoft Learn, Fast startup causes hibernation or shutdown to fail in Windows 10 or Windows 8.1. 关于快速启动不关闭内核会话而是让它休眠,并把内核会话与设备驱动程序保存到 hiberfil.sys;重启执行完整的引导周期;快速启动的设置不适用于重启;它默认启用且不推荐停用;
Shutdown /s /t 0默认是完全关机而/hybrid使其变为混合;休眠处理中初始化内存转储配置失败时会回到锁屏并记录事件 ID 45、应确认DumpFilters。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 -
Microsoft Learn, Delivering a great startup and shutdown experience. 关于 Windows 8.x 以后默认的关机与重启场景被命名为快速启动,会注销所有用户会话(文档中记为「会话 1」)并把其余部分写入休眠文件;启动时不做完整启动而是从休眠文件读取已初始化的状态;用户操作的关机会保存并还原内核・驱动程序・服务而不是重启,因此内核两次启动之间的运行时间可能比以前长得多;应监视驱动程序与服务的内存泄漏;休眠文件的读写约占启动时间的 50%;关机 API 的行为表(
InitiateSystemShutdownEx与InitiateSystemShutdown始终是完全关机,InitiateShutdown用SHUTDOWN_HYBRID、ExitWindowsEx用EWX_HYBRID_SHUTDOWN得到快速启动用的关机)。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 -
Microsoft Learn, Updates may not be installed with Fast Startup in Windows 10. 关于启用快速启动时关机之后更新程序可能不被安装而重启时不会发生;一部分更新只有在完全关机之后的启动中才能完成;要完成待处理的更新应从电源菜单选择「重启」;Configuration Manager 环境中的延迟已在 Configuration Manager 2002 与 Windows 10 21H1 中得到处理。 ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Wake on LAN (WOL) behavior in Windows 10. 关于 Windows 7 默认的关机是 S5 而从 S5 的 WOL 官方不受支持,但有些机型因残留电力可以唤醒;Windows 10 默认的关机是混合关机(S4),从 S4・S5 的 WOL 不受支持,网络适配器不会被显式准备成可唤醒;WOL 仅在睡眠(S3)或用户显式选择的休眠(S4)时受支持;Windows 显式停用 WOL 只发生在进入混合关机的转换中,进入休眠的转换中不停用;有些机型的固件与硬件支持从 S4/S5 唤醒,那种情况下 Windows 不参与;在控制面板的「电源选项」>「选择电源按钮的功能」中取消「启用快速启动(推荐)」来停用的步骤,以及不推荐停用。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
Microsoft Learn, Distinguishing fast startup from wake-from-hibernation. 关于启动模式有冷启动・从休眠恢复・快速(Windows 8 引入)三种;冷启动会加载内核・枚举设备・加载驱动程序,而快速启动只是读取休眠文件;为快速启动做准备时会关闭应用、注销所有用户会话,向驱动程序发送准备休眠的电源 IRP,把包含内核模式驱动程序的内核内存映像保存到 hiberfil.sys 之后再断电;可用
SYSTEM_POWER_STATE_CONTEXT的TargetSystemState与EffectiveSystemState区分两者;NDIS 驱动程序在快速启动时停用微型端口的唤醒功能而在休眠恢复时不停用;在冷启动与休眠恢复时改变配置的驱动程序在快速启动之后应按冷启动配置。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 -
Microsoft Learn, System power states. 关于快速启动是先注销用户再创建休眠文件的一种关机;在用户看来是 S5 而实际经由 S4,对设备唤醒警报的响应也随之;会话 0 的内容被写到磁盘;休眠文件有完整(默认 40%)与缩小(默认 20%,仅快速启动)两种且
powercfg /a的显示各不相同;/type reduced失败时要先执行/size 0;关机请求默认是快速启动,而重启请求与从应用调用关机 API 时会变成完全关机(S5);进入休眠时应用・服务・驱动程序会收到通知,恢复时驱动程序与服务不被重启而是还原到休眠前的状态;InitiateShutdown的SHUTDOWN_HYBRID与ExitWindowsEx的EWX_HYBRID_SHUTDOWN。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 -
Microsoft Learn, Per-user services in Windows. 关于用户登录时创建每用户服务、注销时停止并删除。 ↩ ↩2
-
Microsoft Learn, Optimizing Performance and Responsiveness. 关于 Windows 8 引入的快速启动是默认的启动行为,关机处理被更新为以与休眠相同的方式把数据写到磁盘;启动会经过 BIOS 初始化・读取休眠文件・恢复设备・恢复 Winlogon・初始化 Explorer・Post On/Off 各阶段;休眠文件中包含关机时写入的全部系统上下文。 ↩
-
Microsoft Learn, shutdown. 关于
/s关闭计算机;/hybrid是关闭设备并为快速启动做准备的选项、与/s组合使用;/g完全关机后再重启,并在启用自动重启登录时恢复已注册的应用;/t的默认值是 30 秒且可以指定 0。 ↩ ↩2 ↩3 -
Microsoft Q&A, why is Task Host preventing shutdown?. 关于支持的回答中介绍:在桌面或登录画面按住 Shift 键选择「关机」,就会仅此一次临时停用快速启动并成为完全关机(这不是官方参考文档,而是社区的支持回答)。 ↩
-
Microsoft Learn, InitiateSystemShutdownExA function (winreg.h). 关于
bRebootAfterShutdown为 TRUE 时关机后立即重启、为 FALSE 时把缓存写到磁盘并安全断电;关闭本地电脑需要调用线程具有SE_SHUTDOWN_NAME特权,默认情况下已登录的用户可以启用该特权。 ↩ ↩2 ↩3 -
Microsoft Learn, WMI Tasks: Desktop Management. 关于用
Win32_OperatingSystem类的LastBootUpTime属性从当前时间减去它来求计算机的运行时间。 ↩ -
Microsoft Learn, Get-Uptime. 关于它在 PowerShell 6.0 中引入,用高分辨率计时器(自系统启动以来的滴答数)计算自上次操作系统启动以来的经过时间,因此可能与从 WMI 的
Win32_OperatingSystem的LastBootUpTime求得的值略有不同。 ↩ -
Microsoft Learn, Ethernet. 关于默认的关机行为是混合关机(S4);混合关机(S4)与完全关机(S5)时网卡都不会被准备成可唤醒,远程唤醒不受支持;WOL 仅在睡眠(S3)或休眠(S4)时受支持。 ↩
-
Microsoft Learn, Modern Standby Wake Sources. 关于 Modern Standby 电脑在屏幕关闭时仍连接网络(Wi-Fi・移动宽带・以太网)以低功耗待机;Wi-Fi・以太网・MBB 设备提供持续连接并成为唤醒源;远程桌面与文件共享在以太网连接时可以唤醒 SoC;Windows 11 version 24H2 及以后检测到电池消耗过度时会停用许多唤醒源。 ↩ ↩2
-
Microsoft Learn, Wake On LAN for Surface devices. 关于 Modern Standby 中的 Surface 设备从 Windows 10 version 1607 起默认可用 Wake on LAN;从休眠(S4)或关机(S5)唤醒需要 Surface Dock 2 等扩展坞一侧的支持。 ↩
-
Microsoft Learn, Hibernate Once/Resume Many (HORM). 关于停用快速启动的注册表值是
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power的HiberbootEnabled(DWORD,0 为停用,1 为启用);停用休眠的powercfg /h off会删除 hiberfil.sys。 ↩ ↩2 ↩3 -
Microsoft Learn, Policy CSP - ADMX_WinInit. 关于策略「要求使用快速启动」(Hiberboot、WinInit.admx、计算机配置 > 系统 > 关机)控制快速启动的使用,启用时系统要求休眠处于启用状态,停用或未配置时使用本地的设置;注册表键是
Software\Policies\Microsoft\Windows\System、值名是HiberbootEnabled;可从 Intune 以./Device/Vendor/MSFT/Policy/Config/ADMX_WinInit/Hiberboot配置。 ↩ ↩2 ↩3 -
Microsoft Learn, How to troubleshoot unexpected reboots by using the system event logs. 关于事件 ID 1074 中记录请求关机的进程・用户・原因与关机的种类;41 与 6008 表示意外的停止。 ↩
-
Microsoft Learn, How to disable and re-enable hibernation on a computer that is running Windows. 关于
powercfg.exe /hibernate off与on的步骤;停用休眠后混合睡眠将无法工作;hiberfil.sys 是位于安装操作系统的驱动器根目录的隐藏系统文件、大小与 RAM 容量大致相同,没有它就无法休眠。 ↩ ↩2 -
Microsoft Learn, Powercfg command-line options. 关于
/hibernate的on/off;/size以相对内存容量的百分比指定休眠文件的大小;/type reduced | full指定休眠文件的种类,缩小休眠文件仅支持 hiberboot;HiberFileSizePercent为 40 以上时视为完整休眠文件,要改成缩小需先执行/size 0。 ↩ -
Microsoft Learn, InitiateShutdownA function (winreg.h). 关于在 Windows 8 及以后要把
SHUTDOWN_HYBRID与同一张表中的一个以上标志组合指定(成为快速启动用关闭电源的是与SHUTDOWN_POWEROFF的组合,SHUTDOWN_RESTART是重启,SHUTDOWN_NOREBOOT是不切断电源只停下来);没有SHUTDOWN_HYBRID时始终是完整的系统关机。 ↩ ↩2 -
Microsoft Learn, ExitWindowsEx function (winuser.h). 关于
EWX_HYBRID_SHUTDOWN在 Windows 8 及以后与EWX_SHUTDOWN组合来请求为快速启动做准备的关机;非交互用户应使用InitiateSystemShutdown/InitiateSystemShutdownEx;关机或重启需要调用进程用AdjustTokenPrivileges启用SE_SHUTDOWN_NAME特权;EWX_SHUTDOWN只是把系统停到可以安全断电的状态,切断电源的是EWX_POWEROFF。 ↩ ↩2 ↩3 ↩4 -
Microsoft Learn, Suspend Services Duration. 关于所有注册为接收电源管理事件(
SERVICE_ACCEPT_POWEREVENT)的服务都会收到挂起通知;通知串行发送且每个服务适用 30 秒超时;从服务的角度看快速启动与休眠相同。 ↩ ↩2 -
Microsoft Learn, SERVICE_STATUS structure (winsvc.h). 关于只有在
dwControlsAccepted中置位SERVICE_ACCEPT_SHUTDOWN/SERVICE_ACCEPT_PRESHUTDOWN/SERVICE_ACCEPT_POWEREVENT的服务,才会分别收到SERVICE_CONTROL_SHUTDOWN/SERVICE_CONTROL_PRESHUTDOWN/SERVICE_CONTROL_POWEREVENT的通知。 ↩
相关文章
共享相同标签的最新文章。可以围绕相近的主题进一步加深理解。
Windows 名称解析的顺序 ── hosts、DNS 缓存、LLMNR/mDNS 与 DoH
「解析不了名称」「只有部分电脑连不上」,结果取决于是 hosts、DNS 缓存、DNS 服务器还是 LLMNR/mDNS 给出的答案。本文从机制上梳理 Windows 名称解析的顺序与 DoH 改变了什么,并讲解按层排查的步骤。
从睡眠恢复后损坏的应用 ── Windows 电源事件机制与扛得住恢复的业务应用
打开笔记本后业务应用的连接全断了——原因是设计从未考虑睡眠。本文根据一手资料整理 WM_POWERBROADCAST 通知流程、Modern Standby 行为、断开/重连设计、睡眠抑制与调查命令。
从应用看到的 Windows 关机 ── 正确扛住退出通知、重启与断电
夜间 Windows Update 重启把测量数据弄坏——这种事故可用设计避免。本文依一次信息整理 WM_QUERYENDSESSION 与 PRESHUTDOWN 等结束通知的接法、几秒内做完收尾,以及断电也不留下半截文件的写法。
在 C# / PowerShell 中使用 WMI/CIM ── 硬件信息获取・进程监控・远程查询实务指南
获取电脑序列号、监控磁盘剩余空间、检测进程启动,这些场景的经典方案就是 WMI/CIM。本文讲解 Get-CimInstance 等 CIM cmdlet 的用法与从旧版 Get-WmiObject 的迁移、C# 中 System.Management 与 CIM API ...
Time Travel Debugging ── 把长期运行中不复现的缺陷“录下来”再倒回去
一个月才出一次的缺陷,崩溃转储只拍得到结果。本文讲解如何用 WinDbg 的 Time Travel Debugging(TTD) 录制执行并倒回,涵盖 TTD.exe 的录制设计、环形缓冲区、TTD.Calls 查询,以及与转储的分工。
相关主题
与本文相近的主题页面。以本文为起点,可以进一步了解相关服务和其他文章。
Windows 技术主题
汇整 KomuraSoft LLC 关于 Windows 开发、故障调查与既有资产活用文章的主题中心。
常见问题
汇总了咨询这一主题时常见的问题。
- 「关机」都解决不了的问题,一「重启」就好了。这是为什么?
- 在 Windows 8 以后的客户端操作系统上,快速启动处于启用状态的配置(支持休眠的多数电脑的默认设置)下的「关机」会变成混合关机。用户会被注销,但内核、驱动程序、服务的状态会被保存到休眠文件(hiberfil.sys),并在下次启动时原样还原。也就是说操作系统的核心部分并没有被重置。而「重启」与快速启动的设置无关,始终执行完整的引导周期,因此驱动程序或服务的异常状态会被重置。不过,仅凭「重启后好了」并不能确定原因。间歇性的问题可能只是碰巧没有重现,也可能是重启让待处理的更新完成了才好的。请多次确认「关机后会重现、重启后不重现」,并用系统日志的 Kernel-Boot 事件 27 确认最近一次启动是 0x1(快速启动),以及驱动程序一侧的记录来佐证,然后再把被带过来的状态当作原因。排查问题时请使用「重启」而不是「断电再通电」。
- 任务管理器的运行时间好几天都不重置。是坏了吗?
- 运行时间的计数器本身工作正常。如果每晚都「关机」而运行时间仍在增加,那多半是快速启动(混合关机)的规格所致;但关机失败没有完成时看起来也一样,所以在确认后文的事件 27 与周边日志之前,不要断定「没坏」。运行时间是内核启动之后的经过时间,而混合关机只是让内核休眠再还原,所以计数器会继续走。Microsoft 的文档也明确写道:用户操作的关机会保存并还原内核、驱动程序、服务而不是重启它们,因此内核两次启动之间的运行时间可能比以前的 Windows 长得多。不过运行时间在从睡眠或休眠恢复、以及未完成的关机之后同样会保持,所以要确定的话请用系统日志的 Kernel-Boot 事件 27 确认最近一次启动的种类是 0x1(快速启动)。想重置运行时间时请选择「重启」,或用 shutdown /s /t 0 执行完全关机。
- 快速启动是不是关掉比较好?
- 不建议一律关掉。Microsoft 并不推荐停用快速启动,而且在一般的笔记本电脑上启动变快的好处更大。值得关掉的是那些以「一断电所有东西都会初始化」为前提运营的终端,例如设备用 PC 或验证机;以及与其他操作系统共用同一块磁盘的双系统环境,或者会从别的操作系统启动并写入卷的验证机(这种情况下只关掉快速启动仍会留下显式的休眠,所以请用 powercfg /h off 把休眠也一并停用,或者在切换操作系统之前把完全关机写成必做步骤)。如果目的是腾出磁盘空间,那么关掉快速启动并不会删除休眠文件(hiberfil.sys),达不到目的。想保留快速启动又想缩小休眠文件就用 powercfg /h /type reduced,连休眠都不需要就用 powercfg /h off。如果只是想「重置一次」,不改设置直接重启或 shutdown /s /t 0 就够了。
- 关机状态的电脑没法用 Wake on LAN 唤醒。
- 在 Windows 10/11 上,无论是默认的关机(混合关机)还是完全关机(S5),Wake on LAN 都不受支持。因为用户下达关机指令时期待的是零耗电,所以 Windows 不会把网络适配器准备(arm)成可唤醒状态。可以使用 Wake on LAN 的是睡眠(S3),或者用户显式选择了休眠(S4)的情况。混合关机的实体虽然也是 S4,但 Windows 只在进入混合关机的转换时显式停用 Wake on LAN。想在夜间唤醒并更新的终端,请用「睡眠」或「休眠」来运营,或者确认固件一侧的唤醒功能。在没有 S3 的 Modern Standby(S0 低功耗空闲)机型上,睡眠中网络也可能成为唤醒源,但实际能否唤醒取决于网卡、固件、电源条件与 OEM 的实现,所以在纳入运营之前请在实际设备上确认。
- Windows 更新时选了「更新并关机」,可是下次启动后更新还没结束。
- Microsoft 的支持信息中明确写道,一部分更新程序只有在完全关机之后的启动中才能完成应用,经由快速启动(休眠)的启动可能无法完成。想确实结束更新时请选择「更新并重启」。在用 Configuration Manager 管理的环境中,这个延迟在 Configuration Manager 2002 与 Windows 10 21H1 中已有改善。
- 我在自制的业务应用里调用 shutdown。用哪个 API 才会是完全关机?
- InitiateSystemShutdownEx 与 InitiateSystemShutdown 不会变成混合关机,把 bRebootAfterShutdown 设为 FALSE 就是关闭电源(完全关机),设为 TRUE 就是重启。InitiateShutdown 只有在把 SHUTDOWN_HYBRID 标志与 SHUTDOWN_POWEROFF 组合时(与 SHUTDOWN_RESTART 组合就是重启,SHUTDOWN_NOREBOOT 则是不切断电源只停下来),ExitWindowsEx 只有在把 EWX_HYBRID_SHUTDOWN 与 EWX_SHUTDOWN 组合时(不单独指定 EWX_HYBRID_SHUTDOWN),才会成为快速启动用的关机。如果你在应用里实现设备用 PC 的「关闭电源」按钮,那么用 bRebootAfterShutdown = FALSE 调用 InitiateSystemShutdownEx,或者只用 EWX_POWEROFF 调用 ExitWindowsEx(不带 EWX_HYBRID_SHUTDOWN。EWX_SHUTDOWN 只是把系统停在可以安全断电的状态,并不会切断电源),就会与设置无关地成为完全关机(两者都以先用 AdjustTokenPrivileges 启用 SE_SHUTDOWN_NAME 特权为前提,ExitWindowsEx 在进程的令牌上启用,InitiateSystemShutdownEx 在调用线程的有效令牌上启用。保持停用状态就会失败)。命令方面,shutdown /s /t 0 默认是完全关机,只有加上 /hybrid 时才是混合的。