從 UAC 提權、移除預裝、裝軟體與 Office、工作列到交機驗證的完整流程,以及每一段裡會靜默失效的地方。
發布於 2026-09-05・約 9 分鐘
每台新電腦要做的事其實都一樣:移掉原廠塞的東西、裝公司要的軟體、調電源跟螢幕保護、整理工作列、掛印表機。一台大概一小時,十台就是一整週。
我把整套流程寫成一個工具:一份設定檔決定「這台要做哪些事」,勾選、存檔,之後每台新電腦跑一次就好。 這篇是完整流程的走法;每一段都有一個會靜默失效的地方,展開細節的文章連在該段裡面。
AutoSet.bat 唯一入口:UAC 提權 + 選單 ├─ Core\ │ AutoSet.ps1 主程式:載入設定 → 依 Order 執行 → 印總結表 │ Lib\Common.ps1 共用函式(移除、安裝、登錄、釘選、字型…) │ Lib\Verify.ps1 套用結果驗證 │ Tasks\*.ps1 功能模組,一個檔案定義一到多個可勾選項目 ├─ Config\*.json 設定值,一個部署情境一份 ├─ Resources\Installers\ 離線安裝檔 └─ Tools\ 獨立工具(印表機備份還原、加入網域…)
兩個決定影響了後面所有事:
一、功能寫成外掛。 Tasks\ 底下丟一個 .ps1 就會自動出現在清單裡,刪掉檔案設定檔會自己變乾淨,不用手動改 JSON。代價是 Run 那個 scriptblock 看不到定義它的檔案裡的變數與函式,這個作用域規則跟另外三個型別坑寫在 拿 JSON 當設定檔、拿 scriptblock 當外掛,PowerShell 咬我的四口。
Tasks\
.ps1
Run
二、一個部署情境一份設定檔。 Office 版本混雜的環境特別需要:2021 大量授權一份、M365 訂閱一份、2016 走離線安裝檔再一份。交機時選對應的那份,不用每次進設定改參數。
AutoSet.bat 只做兩件事:UAC 提權、把參數轉發給 PowerShell。它裡面一個中文字都沒有——cmd.exe 照開檔當下的字碼頁逐行讀批次檔,UTF-8 中文會讓行解析錯位,被切出來的碎片還會被當成指令執行。看得到的中文選單全部畫在 .ps1 裡。
AutoSet.bat
這一段連同「提權參數為什麼要走環境變數」在 批次檔裡放中文,cmd.exe 會從中間把那一行切開。
跑之前有兩個只讀不寫的動作值得先做:
移除任何東西之前先建系統還原點:
Enable-ComputerRestore -Drive "$env:SystemDrive\" Checkpoint-Computer -Description "AutoSet 執行前" -RestorePointType "MODIFY_SETTINGS"
Windows 對同一天內重複建立還原點有限制,同一天跑第二次會被擋掉。這種情況要標成「略過」而不是「失敗」,不然總結表上會出現一個假的紅字。
原廠塞的東西分三類,移除方式完全不同,得三路並行:
Remove-AppxPackage
Remove-AppxProvisionedPackage
Appx 那一路一定要連佈建套件一起移,否則新建立的使用者帳號登入時又會自動裝回來。
防毒的原廠移除工具(MCPR、NRnR)預設不下載,因為它們會跳互動視窗。真的要用就三道保護:只接受 https 網址、下載回來先驗 Authenticode 簽章(無效就刪掉不執行)、執行要有逾時。
一般軟體走 winget,內網環境改走離線安裝檔。這一步有四個地方會安靜地做出錯的結果:.msi 直接執行參數會被整包忽略、winget list 認不出手動裝的軟體導致每次重裝、結束碼 3010 其實是成功、沒有逾時的安裝程式會卡住整條流程。細節在 靜默安裝軟體的四個坑。
.msi
winget list
Office 是例外,不能用 winget。 它挑不了語言、更新通道與大量授權版本。正解是 Office 部署工具(ODT),把 configuration.xml 用參數生出來;產品代碼要對到通道年份、金鑰只能從環境變數讀而且用完刪檔、setup.exe 回傳 0 也可能什麼都沒裝。整套做法在 用指令碼裝 Office:winget 不行,只能走 ODT。
configuration.xml
setup.exe
順序要排好:移除 OEM Office 會移除機器上所有 Click-to-Run 版 Office,所以它跟安裝 Office 基本上是一組,先移除後安裝。
這一段最單純,powercfg /change 四個逾時值加三個登錄值:
powercfg /change
powercfg /change monitor-timeout-ac 20 powercfg /change standby-timeout-ac 0 # 0 = 永不
螢幕保護寫在 HKCU:\Control Panel\Desktop,設完要 rundll32.exe user32.dll,UpdatePerUserSystemParameters 才會立刻生效。
HKCU:\Control Panel\Desktop
rundll32.exe user32.dll,UpdatePerUserSystemParameters
寫在 HKCU 就代表它跟著執行這支程式的帳號走。用 IT 的管理員帳號提權執行,設定會落在 IT 帳號身上,使用者登入之後什麼都沒變,而指令碼全程回報成功。這是三道 per-user 牆的第一道,另外兩道(.zip 關聯改不動、DISM 預設程式只影響新帳號)在 三種你用管理員身分改不到使用者身上的 Windows 設定。
HKCU
.zip
Windows 10 的做法(匯入 Taskband 登錄機碼)在 Windows 11 上會被系統忽略,reg import 照樣回 0。現在只剩 LayoutModificationXML 加群組原則這條路,而且要鎖定原則才會套用、要登出再登入才生效、還得自己排一個登入後解鎖的排程,否則使用者從此不能自己調工作列。完整五步在 Windows 11 的工作列釘選,只剩群組原則這條路。
reg import
工作列靠左、隱藏搜尋框那些是另一組登錄值,跟釘選機制無關,重啟 Explorer 就生效。
Edge IE Mode 的 ADMX 範本、信任的網站 .reg、字型安裝、gpupdate。
.reg
一個部署細節值得單獨講:sitelist.xml 的部署位置**不要填 D:\**。群組原則會一直參照那個路徑,填了不是每台機器都有的磁碟,沒有那個磁碟的機器直接失敗,有的機器則指到一個不存在的檔案。預設值選 C:\ProgramData\ 底下。
sitelist.xml
D:\
C:\ProgramData\
字型安裝要三件事一起做才會即時生效:複製到 C:\Windows\Fonts、寫登錄值、AddFontResourceW 加上廣播 WM_FONTCHANGE。只做前兩步是「重開機之後才有」。
C:\Windows\Fonts
AddFontResourceW
WM_FONTCHANGE
這兩個是獨立工具,因為過程需要互動或需要在舊電腦上先跑。
印表機的官方工具 printbrm.exe 在 Windows 10 2004 之後已被移除,只能自己用 PowerShell cmdlet 重做一份備份還原。Add-PrinterPort 用 -PrinterHostAddress 建出來的一律是 RAW/9100,LPR 得改走另一組參數而且不會有錯誤訊息——這個跟驅動路徑爆 260 字元、WPP 擋第三方驅動一起寫在 printbrm 被移除之後,印表機怎麼搬到新電腦。
printbrm.exe
Add-PrinterPort
-PrinterHostAddress
加入網域的失敗原因幾乎都是同樣那幾個:DNS 指到外部而不是公司的 DC、AD 裡已經有同名電腦物件、本機時間跟 DC 差超過五分鐘(Kerberos 會拒絕)、一般網域使用者預設只能加入十台電腦。所以那支工具在輸入帳密之前,會先用 SRV 記錄確認找不找得到網域控制站。
這是我最晚才加、但最有價值的一段。執行階段的「成功」意思很窄,它只代表那幾行程式碼沒拋例外,不代表參數被接受、值被系統採用、寫對了帳號。
所以流程最後會回頭讀系統現在的實際狀態,跟設定檔對照,印一張交機檢查表。判定分五種:通過、未套用、需重開機、未勾選、無法驗證。中間那三種才是重點——工作列釘選是「需重開機」,DISM 預設關聯是「無法驗證」,硬塞進「通過」整張表就沒有意義了。
驗證本身也有坑,例如 powercfg /query 的輸出解析錯會得到「71582788 分鐘」這種鬼數字。做法在 跑完不等於生效:幫部署流程補一張交機檢查表。
powercfg /query
回頭看這八段,會出事的地方形狀完全一樣:失敗不會叫。
參數被忽略、重複安裝、成功被當成失敗、設定寫到別人帳號、登錄值被系統無視、安裝程式回 0 卻什麼也沒裝——沒有一個會拋例外,全部都是安靜地做出一個不是你要的結果。
所以自動化流程真正的成本不在寫,在於知道它什麼時候在騙你。每個「應該會成功」的地方都回讀一次確認,比相信沒有例外就是對的划算太多。
標籤:Windows、部署、PowerShell、交機、自動化