快速啟動的真面目 ── Windows 的「關機」為什麼和重新啟動不一樣
· 更新日期: · Go Komura · Windows, 快速啟動, 關機, 電源管理, 資訊部門, 設備用電腦, PowerShell, Windows 開發
「關機之後斷電再通電,印表機還是認不出來。可是一重新啟動就好了」
理解這個差別的鑰匙,就是 Windows 的快速啟動。在 Windows 8 以後,支援休眠且啟用了這個功能的電腦上,「關機」並不是把 Windows 的狀態全部重新建立的操作。應用程式與使用者工作階段會關閉,但核心、驅動程式、服務的狀態會被保存下來,並在下次開機時還原。這稱為混合關機。12
另一方面,「重新啟動」與快速啟動的設定無關,一律執行完整的開機週期。「斷電再通電」和「重新啟動」並不是同一個操作。1
本文先給出操作的選法,再講它的理由、依症狀的釐清、確認方法,最後是設定變更的判斷。API 與 Windows 服務在實作上的注意點整理在第 7 章。對象是管理 Windows 10/11 的資訊部門人員,以及面向設備用電腦・驗證機的 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
在設備用電腦的結束處理或批次中,這條命令也能明確表達「完全結束並切斷電源」的意圖。另外,/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 NIC 詳細設定指南」。
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 追查「設備用電腦早上停了」的步驟在「從應用程式看 Windows 關機」中說明。
6. 停用快速啟動的判斷與步驟
6.1 不要一律關掉,依終端的角色來定
Microsoft 把快速啟動設為預設啟用,並不推薦停用。它有縮短開機時間的好處,在面向硬體的資料中,休眠檔的讀寫被當成占開機時間約 50% 的重要處理。在一般的筆記型電腦上,沒有一律關掉的理由。12
判斷的軸有兩個:「以斷電即初始化為維運前提嗎」和「會從別的作業系統改寫同一個磁碟區嗎」。這兩者是獨立的。不要因為是設備用電腦就關掉然後結束確認,還要確認有沒有來自別的作業系統的寫入。
| 終端的角色・目的 | 建議的對應 | 理由 |
|---|---|---|
| 設備用電腦・量測用電腦,以斷電初始化為維運前提 | 關掉 | 在無法把作業手冊改成「重新啟動」的現場,用設定來保證初始化 |
| 驗證機・多個作業系統共用同一顆磁碟的終端 | 除關掉外還要停用休眠,或把切換作業系統前的完全關機設為必做 | 只停掉快速啟動,明確休眠造成的不一致仍會留下(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,也就是登出 |
要在自助服務終端或設備用電腦上實作「關閉電源」按鈕,就用 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. 反映到作業手冊與監視中
理解了機制之後,就把現場的操作與措辭對齊。
| 維運的場景 | 寫進作業手冊・通知的內容 |
|---|---|
| 問題的初次釐清 | 不是「斷電再通電」,而是「重新啟動」 |
| 運作時間超過門檻時 | 「請重新啟動」。說明為什麼每天關機也會被警告 |
| 想讓更新完成時 | 把「更新並重新啟動」當成標準 |
| 作為設備用電腦的標準組態停用時 | 把 6.3 的登錄檔設定納入裝機,並用第 5 章的方法對一般關機後的開機做驗收確認 |
明確寫「重新啟動」,對於避免現場用長按電源按鈕強制斷電也很重要。依運作時間的監視可以照舊使用。因為它正確地偵測出了在快速啟動的終端上核心沒有被重新啟動。
即使重新啟動後問題消失,也要取得 4.1 的重現確認與記錄檔佐證,再反映到步驟或設定中。如果重新啟動也好不了,就去追查快速啟動以外的原因。更新與設備用電腦應用程式的關係請參見「從應用程式看 Windows 關機」。3
9. 總結
要記住的是,啟用了快速啟動的「關機」是使用者看到的斷電,而不是把 Windows 的狀態全部重新建立的操作。應用程式與使用者工作階段會關閉,但核心、驅動程式、工作階段 0 的服務是被保存並還原的。52
在關掉了快速啟動的電腦,或沒有休眠檔的電腦上,一般的「關機」同樣會關閉核心工作階段並進入 S5。
想重設一次就選重新啟動,想完全結束並切斷電源就選 shutdown /s /t 0。不要光憑重新啟動後好了就斷定原因,要用重現確認以及事件 27 與周邊記錄檔來佐證。19
是否關掉快速啟動,依是不是以初始化為前提的終端和是不是會從別的作業系統改寫同一個磁碟區的終端來判斷。對於後者,還需要針對明確休眠的對策。如果目的是 WOL,那要重新檢視的不是設定的開關,而是待機狀態。17204
相關文章
- 從應用程式看 Windows 關機 ── 正確扛住結束通知、重新啟動與斷電
- 從睡眠恢復就壞掉的應用程式 ── Windows 電源事件的機制,以及耐得住恢復的業務應用寫法
- 睡眠・休眠・Modern Standby 與長時間執行的應用程式 ── 用設計預防「半夜停止運轉」
- Windows 的效率模式是什麼 - Windows 11 的綠色葉子圖示代表什麼,以及如何關閉
- Windows NIC 詳細設定指南 - RSS/LSO/EEE/Wake on LAN
- WSUS 淘汰後的 Windows Update 管理 ── 該如何選擇 WUfB、Autopatch、Intune
- 工業用電腦該安裝哪一種 Windows ── Windows IoT Enterprise / LTSC 實戰指南
- Windows 服務的建立與維運 ── 從工作排程器的取捨到 BackgroundService 服務化
相關的諮詢領域
小村軟體有限公司承接包含設備用電腦・自助服務終端的電源維運(關機・睡眠・休眠・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 ── 硬體資訊取得・處理程序監控・遠端查詢的實務指南
取得 PC 序號、監控磁碟可用空間、偵測處理程序啟動,這些定番需求的標準答案就是 WMI/CIM。本文解說 Get-CimInstance 等 CIM Cmdlet 的用法、從舊版 Get-WmiObject 的遷移方式、C# 的 System.Management 與 C...
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 並不推薦停用快速啟動,而且在一般的筆記型電腦上開機變快的好處更大。值得關掉的是那些以「一斷電所有東西都會初始化」為前提運作的終端,例如設備用電腦或驗證機;以及與其他作業系統共用同一顆磁碟的雙系統環境,或者會從別的作業系統開機並寫入磁碟區的驗證機(這種情況下只關掉快速啟動仍會留下明確的休眠,所以請用 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 Update 時選了「更新並關機」,可是下次開機後更新還沒結束。
- 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),才會成為快速啟動用的關機。如果你在應用程式裡實作設備用電腦的「關閉電源」按鈕,那麼用 bRebootAfterShutdown = FALSE 呼叫 InitiateSystemShutdownEx,或者只用 EWX_POWEROFF 呼叫 ExitWindowsEx(不帶 EWX_HYBRID_SHUTDOWN。EWX_SHUTDOWN 只是把系統停在可以安全斷電的狀態,並不會切斷電源),就會與設定無關地成為完全關機(兩者都以先用 AdjustTokenPrivileges 啟用 SE_SHUTDOWN_NAME 權限為前提,ExitWindowsEx 在處理程序的權杖上啟用,InitiateSystemShutdownEx 在呼叫執行緒的有效權杖上啟用。維持停用狀態就會失敗)。命令方面,shutdown /s /t 0 預設是完全關機,只有加上 /hybrid 時才是混合的。