Files
windows-unattend/DEPLOY.md

175 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DEPLOY — 本機 Ventoy USB 部署紀錄
這份文件記錄本機 Ventoy USB`/Volumes/Ventoy`)上 `unattend.xml``ventoy.json` 的實際部署方式,供下次換機、換 ISO、或刷新 USB 內容時照著做。
概念與疑難排解請看 `QUICKSTART.md`;這份只寫「這顆 USB 目前的樣子」和「怎麼重建它」。
---
## 目前 USB 內容
掛載點:`/Volumes/Ventoy`
USB 根目錄兩個 ISO
| 檔名 | 用途 |
|---|---|
| `Windows 11_25H2_Chinese_Traditional_x64v1.iso` | Win11 25H2 繁中 x64 |
| `Windows 10_22H2_Chinese_Traditional_x64v1.iso` | Win10 22H2 繁中 x64 |
注入檔案佈局:
```
/Volumes/Ventoy/
├── Windows 11_25H2_Chinese_Traditional_x64v1.iso
├── Windows 10_22H2_Chinese_Traditional_x64v1.iso
└── ventoy/
├── ventoy.json ← 對應兩個 ISO都指向同一份 template
└── script/
└── unattend.xml ← 與 repo 根目錄的 unattend.xml 相同
```
---
## USB 上的 `ventoy.json`
**與 repo 根目錄的 `ventoy.json` 不同** —— repo 版本保留通用示範路徑 `/Win11.iso`USB 版本則綁定本機這兩個 ISO 的實際檔名,並帶了 `menu_tip` 讓 Ventoy 選單上顯示每個 ISO 會做什麼:
```json
{
"auto_install": [
{
"image": "/Windows 11_25H2_Chinese_Traditional_x64v1.iso",
"template": "/ventoy/script/unattend.xml"
},
{
"image": "/Windows 10_22H2_Chinese_Traditional_x64v1.iso",
"template": "/ventoy/script/unattend.xml"
}
],
"menu_tip": {
"left": "10%",
"top": "81%",
"color": "white",
"tips": [
{
"image": "/Windows 11_25H2_Chinese_Traditional_x64v1.iso",
"tip": "Win11 25H2 自動安裝清碟→Admin/P@ssw0rd!→裝 Telegram→重開UEFI+GPT會清空目標碟"
},
{
"image": "/Windows 10_22H2_Chinese_Traditional_x64v1.iso",
"tip": "Win10 22H2 自動安裝清碟→Admin/P@ssw0rd!→裝 Telegram→重開UEFI+GPT會清空目標碟"
}
]
}
}
```
- `image` 路徑以 `/` 開頭,相對 USB 根目錄,**完整檔名必須跟 USB 上一字不差**(含空格、底線、版本號)。`menu_tip.tips[].image` 也要跟著同步,否則光標移到 ISO 上不會跳 tip。
- 兩個 ISO 共用同一份 `unattend.xml`;該 XML 目前以 UEFI+GPT 全碟清除方式部署,兩個版本皆適用。
- 若日後只想其中一個 ISO 走自動安裝、另一個保留互動安裝,刪掉 `auto_install` 對應的物件即可Ventoy 找不到對應 `image` 時會走一般安裝流程(`menu_tip` 那條保留沒關係,不跳 auto install
- `menu_tip.tip` 是**單行**的;[Ventoy 文件](https://www.ventoy.net/en/plugin_menutip.html)明確說不支援 `\n`,換行會被一律忽略。要多行提示只能靠縮寫或另加 plugin`menu_alias`)。
---
## 重新部署步驟macOS
插入 Ventoy USB 後:
```bash
# 從 repo 根目錄執行
mkdir -p /Volumes/Ventoy/ventoy/script
cp unattend.xml /Volumes/Ventoy/ventoy/script/unattend.xml
# 寫 ventoy.json見上一節內容或直接手編
# 注意image 檔名必須跟 USB 上的 ISO 檔名完全一致
# 清掉 macOS 複製過程產生的 ._ AppleDouble metadata
dot_clean /Volumes/Ventoy/ventoy
```
驗證:
```bash
ls /Volumes/Ventoy/ventoy/ /Volumes/Ventoy/ventoy/script/
diff unattend.xml /Volumes/Ventoy/ventoy/script/unattend.xml # 應無輸出
cat /Volumes/Ventoy/ventoy/ventoy.json
```
---
## 換 ISO 時要改什麼
1. 把新 ISO 丟到 USB 根目錄。
2. 編輯 `/Volumes/Ventoy/ventoy/ventoy.json`,把對應條目的 `image` 換成新檔名(或新增一條)。
3. **不用**動 `/Volumes/Ventoy/ventoy/script/unattend.xml`,除非要改 Windows 版本特有設定。
4. 若 repo 裡的 `unattend.xml` 有更新,重跑一次 `cp``dot_clean` 即可。
---
## 部署後動作FirstLogonCommands 做了什麼)
目標機首次登入 `Admin` 帳號時,下列動作會按 `Order` 依序執行(全部跑完才 reboot
| Order | 動作 | 需要網路? |
|---|---|---|
| 1 | `powershell -File C:\Scripts\Setup.ps1` | 看腳本內容 |
| 2 | `net accounts /maxpwage:unlimited`(密碼永不過期) | 否 |
| 3 | `Rename-Computer` 把主機名改成 `PC-XXXXX`(重開後生效) | 否 |
| 4 | `net user user 1234 /add``/logonpasswordchg:yes`(建立一般使用者 `user`,首次登入強制改密) | 否 |
| 5 | 等網路→`Add-WindowsCapability OpenSSH.Server``Set-Service sshd Automatic``Start-Service sshd`log: `firstlogon-sshd.log` | **是** |
| 6 | 等網路→下載 `https://telegram.org/dl/desktop/win64` → 靜默安裝(`/VERYSILENT /SUPPRESSMSGBOXES /NORESTART`log: `firstlogon-telegram.log` | **是** |
| 7 | `shutdown /r /t 5` 重開機 | 否 |
### 新加入的 `user` 帳號
- **用途**:給使用者日常使用,和部署用的管理員 `Admin` 分開。
- **權限**:一般 `Users` 群組(非 Administrators。需要管理員權限時走 UAC。
- **首次登入強制改密**`/logonpasswordchg:yes` 會在下次登入時跳「密碼必須變更」。可以改成複雜密碼。
- **如果 `net user` 因為 Windows 密碼政策拒絕 `1234`**:整條 Order 4 會失敗但不會擋後面,手動於 PowerShell 以 `New-LocalUser`+更寬的密碼重跑。
### OpenSSH ServerOrder 5
- 走 Windows 內建 Feature on Demand**會從 Windows Update 下載** `OpenSSH.Server~~~~0.0.1.0`。需要外網。
- 完成後 `sshd` 服務設成 `Automatic`(每次開機自動啟動),防火牆規則由 FoD 自動建立TCP 22 inbound allow
- 驗證:`Get-Service sshd` 應該 `Running``Get-NetFirewallRule -Name OpenSSH-Server-In-TCP` 應該 `Enabled=True`
- 用來遠端登入:`ssh Admin@<機器 IP>``ssh user@<機器 IP>`。初次使用要先在 `%ProgramData%\ssh\administrators_authorized_keys` 加公鑰Windows OpenSSH 對 Administrators 群組的授權金鑰路徑特殊,不走 `~/.ssh/authorized_keys`)。
### TelegramOrder 6的注意事項
- **要有網路**OOBE 裡 `SkipMachineOOBE=true` 跳過了網路設定精靈,所以目標機必須有 Ethernet+DHCP或本身已記住 Wi-Fi。這次有 log 可以驗證—`C:\Windows\Temp\firstlogon-telegram.log` 會寫 `NetWait=?s``Downloaded ?B``Exit ?`
- **網路等待上限 60 秒**Order 5 和 Order 6 都各跑一次 `Test-Connection 8.8.8.8` 迴圈,最多等 30 回合×2 秒ICMP 被擋住的環境會等完整 60 秒但 HTTPS 其實可用,也能跑下去。
- **per-user 安裝**Telegram 安裝程式預設裝到 Admin 這個帳號底下,**新建的 `user` 看不到**。要全機安裝就在 `ArgumentList``'/ALLUSERS'`
- **抓的是 latest 版**:每次部署抓當下最新版。要鎖版本改用 `https://updates.tdesktop.com/tsetup/tsetup-x64.X.Y.Z.exe` 直鏈。
- **順序不能搬到 reboot 後**`shutdown /r /t 5` 只是排程重開機、立即回傳,若放在 Telegram 前面,下載安裝會被 5 秒後的關機砍掉。
### 上次部署 Telegram 無聲失敗如何排查
這次每一條都有 log登入 `Admin` 後看
```
notepad C:\Windows\Temp\firstlogon-telegram.log
notepad C:\Windows\Temp\firstlogon-sshd.log
```
常見會看到的值:
| Log 內容 | 代表 | 對策 |
|---|---|---|
| `NetWait=60s` + `ERR ...` | 60 秒內 ICMP 沒通,後面可能也失敗 | 接網路線、或在 OOBE 後手動連 Wi-Fi 後重跑指令 |
| `Downloaded 0B``ERR``SSL/TLS` | TLS 交握失敗 | 檢查系統時間是否對;老機器可能要裝 Windows Update for TLS 1.2 |
| `Exit 0` 但桌面沒 Telegram 捷徑 | 裝成功但 per-user 安裝、不是登入那個帳號 | 以 Admin 登入,捷徑在 `%APPDATA%\Microsoft\Windows\Start Menu\Programs\Telegram Desktop` |
| 完全沒 log 檔 | 這條 `SynchronousCommand` 根本沒跑(通常是 `AutoLogon.Enabled=false` 或 XML 沒注入) | 查 `C:\Windows\Panther\UnattendGC\setupact.log` |
---
## 本次部署已知限制
沿用 repo 預設值,下列情況會失敗,改用前要先處理:
- **目標機若是 BIOS/MBR**`<DiskConfiguration>` 目前寫死 UEFI+GPT分割階段會報錯。
- **ARM64 機器**:所有 `<component>``processorArchitecture="amd64"` 要改成 `arm64`
- **`C:\Scripts\Setup.ps1` 未提供**`FirstLogonCommands` 會在首次登入時報「找不到檔案」。解法:在 `FirstLogonCommands` 前段加一條從 USB 複製的指令,或另外烘進 image或乾脆刪掉 `Order=1` 那條 `SynchronousCommand`
- **密碼是明碼**`<PlainText>true</PlainText>`):僅適合測試用途;正式部署請用 Windows SIM 產 Base64。
- **Telegram 安裝需要外網**目標機沒網路的話Order 4 會失敗但不影響整個流程走完。