傳統 Taskband 登錄機碼在 Win11 會被忽略。改用 LayoutModificationXML 加鎖定原則,還得自己排一個登入後解鎖的排程。
發布於 2026-09-05・約 4 分鐘
交機前把工作列整理成公司要的樣子,只留檔案總管跟瀏覽器。這件事在 Windows 10 時代是匯一個登錄檔就結束的。
Windows 11 上那個做法會靜靜地失效。
傳統釘選資料放在這裡:
HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband Favorites / FavoritesResolve / FavoritesChanges / FavoritesRemovedChanges
Favorites 是一坨二進位資料,裡面是對 .lnk 捷徑的參照。以前的流程是在舊電腦 reg export、在新電腦 reg import、把捷徑檔一起複製過去,重啟 Explorer 就好了。
Favorites
.lnk
reg export
reg import
Windows 11 改用新的驗證機制,塞進去的資料它認不得就直接忽略。匯入不會報錯,reg import 回結束碼 0,重啟 Explorer 之後工作列還是原本的樣子。
我在自己的還原流程裡索性把這個檔案跳過,只在偵測到它時警告一句:
if (Test-Path (Join-Path $dir "Explorer_Taskband.reg")) { Write-AsLog "偵測到 Explorer_Taskband.reg,但在 Windows 11 上不可靠,已略過。" -Level Warn }
同一份備份裡的 Explorer_Advanced.reg(顯示副檔名、工作列靠左那些)和 Search.reg 照樣有效,它們跟釘選機制無關。分開處理比整包放棄好。
Explorer_Advanced.reg
Search.reg
微軟官方文件記載的方式是 LayoutModificationXML 加群組原則。步驟固定五步,少一步就不會生效:
一、把捷徑集中到一個穩定位置。 原則會一直參照這個路徑,不能放暫存資料夾。我用 C:\ProgramData\AutoSet\TaskbarShortcuts。
C:\ProgramData\AutoSet\TaskbarShortcuts
二、產生版面設定 XML。 PinListPlacement="Replace" 代表整份取代,不是附加:
PinListPlacement="Replace"
<LayoutModificationTemplate xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification" xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout" xmlns:taskbar="http://schemas.microsoft.com/Start/2014/TaskbarLayout" Version="1"> <CustomTaskbarLayoutCollection PinListPlacement="Replace"> <defaultlayout:TaskbarLayout> <taskbar:TaskbarPinList> <taskbar:DesktopApp DesktopApplicationID="Microsoft.Windows.Explorer" /> <taskbar:DesktopApp DesktopApplicationLinkPath="C:\ProgramData\AutoSet\TaskbarShortcuts\Google Chrome.lnk" /> </taskbar:TaskbarPinList> </defaultlayout:TaskbarLayout> </CustomTaskbarLayoutCollection> </LayoutModificationTemplate>
檔案總管沒有固定位置的 .lnk,要用 AUMID Microsoft.Windows.Explorer。一般程式用 DesktopApplicationLinkPath 指到捷徑檔。
Microsoft.Windows.Explorer
DesktopApplicationLinkPath
三、設定原則並鎖定:
$policyKey = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Explorer" Set-AsRegValue -Path $policyKey -Name "StartLayoutFile" -Value $layoutPath -Type String Set-AsRegValue -Path $policyKey -Name "LockedStartLayout" -Value 1 -Type DWord
LockedStartLayout = 1 不是選配。官方文件要求鎖定狀態下才會套用版面,只設 StartLayoutFile 沒有用。
LockedStartLayout = 1
StartLayoutFile
四、gpupdate /force。
gpupdate /force
五、登出再登入。 重啟 Explorer 沒有用,這一點跟前面的機制不一樣,我試過很多次。
第三步那個 LockedStartLayout = 1 有副作用:使用者從此不能自己改工作列釘選了。交機給人家用,結果人家連釘一個常用程式都做不到,這比沒設定還糟。
所以套用完要排一個「下次登入時執行一次」的排程,把原則清掉:
$unlockScript = @" Start-Sleep -Seconds 25 Remove-ItemProperty -Path '$policyKey' -Name 'StartLayoutFile' -ErrorAction SilentlyContinue Remove-ItemProperty -Path '$policyKey' -Name 'LockedStartLayout' -ErrorAction SilentlyContinue schtasks.exe /Delete /TN '$taskName' /F "@
$tr = "powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$unlockPath`"" & schtasks.exe /Create /TN $taskName /TR $tr /SC ONLOGON /RU SYSTEM /RL HIGHEST /F
開頭那個 Start-Sleep -Seconds 25 是必要的。登入時 Explorer 還在讀版面,太早把原則拿掉,這次登入就套不到了,得再登出一次。25 秒是我試出來夠用的值。
Start-Sleep -Seconds 25
排程最後一行自己刪掉自己,跑完一次就不留東西在機器上。
同一批設定,生效條件差很多,我整理成四級:
powercfg
AddFontResourceW
WM_FONTCHANGE
字型那一級值得多說一句。複製到 C:\Windows\Fonts 加上寫登錄值,只保證重開機之後有;要讓已經開著的程式立刻抓得到,得自己補這兩步:
C:\Windows\Fonts
$added = [Win32.AsFontApi]::AddFontResourceW($destPath) # 廣播 WM_FONTCHANGE (0x001D),HWND_BROADCAST = 0xffff [void][Win32.AsFontApi]::SendMessageTimeout([IntPtr]0xffff, 0x001D, [IntPtr]::Zero, [IntPtr]::Zero, 0x0002, 1000, [ref]$result)
AddFontResourceW 回傳成功載入的字型數,回 0 就代表沒即時生效,這時候應該告訴使用者「要重開機」,而不是報成功。
釘選這一項沒辦法在套用當下驗證,因為它還沒生效。我的檢查表對它只做到這樣:
$n = ([regex]::Matches((Get-Content $layout -Raw), "<taskbar:DesktopApp")).Count return @{ State = "需重開機"; Detail = "版面設定檔已產生($n 項釘選),要登出再登入才看得到" }
「需重開機」是獨立的一種狀態,跟「通過」和「未套用」都不一樣。硬要判成通過是騙自己,判成未套用又會讓交機的人白忙一場去找哪裡沒設好。
標籤:Windows 11、工作列、群組原則、PowerShell、部署