Windows 鏡像定制非常常見,無論是個人還是組織,為了滿足各種需求,都可能進行 Windows 鏡像定制。常見的定制內容就是精簡系統,如移除不必要的系統組件、模塊、app;以及其他一些系統配置,如關閉一些遙測數據發送,保護用戶隱私安全。這些定制內容的效果,主要體現在用戶后期使用操作系統的過程中。那么在用戶安裝操作系統的過程中,能不能根據需求做一些定制化的操作呢?答案是肯定的。
默認的Windows安裝程序要求用戶在安裝過程中選擇安裝語言、安裝版本、安裝磁盤、所在時區以及后續的用戶名和密碼等設置。以下為普通安裝過程:
電腦電腦思考一下Windows鏡像文件安裝操作系統過程,可以分為兩種方式。首先進入到winPE環境,使用dism應用映像文件或者運行Windows安裝程序。另外一種方式是從可啟動的安裝媒介,比如刻錄的U盤或者DVD來運行Windows安裝程序,進行Windows 操作系統的安裝。
通過鏡像文件安裝操作系統的兩種方式最終都會落腳到 Windows 安裝程序。只要我們能夠接管這一安裝程序,或者說我們自己來實現一個安裝程序來安裝 Windows,就能夠滿足上面的需求。
到這里,定制 windows 10 安裝程序的想法就通順了:啟動盤開始引導,進入winpe,調用定制后的 windows 安裝程序,通過安裝程序來安裝操作系統。所有與用戶的交互以及系統的安裝工作都由安裝程序來實現。所以,簡單來說,這里只需要處理好winpe調用安裝程序的過程以及準備安裝程序這兩點基本就夠了。
思路確定,開始動手!
準備WinPE首先通過 Windows ADK制作WinPE。Windows 鏡像文件中帶有一個PE文件,但選擇 Windows ADK來制作winpe有兩點考慮:1. 鏡像自帶winpe體積比較大,ADK中winpe更加精簡,體積小;2. 鏡像自帶winpe出現過如漢化不全的問題,這時候不太好找到對應的語言包,而ADK中包含比較全面的工具包,所以直接選用ADK來制作winpe。在頁面 Windows ADK頁面下載 Windows ADK,每一個ADK都有對應的windows適用版本,我這里選擇windows 10 1809 版本:Windows ADK for Windows 10 版本 1809適用于 ADK 版本 1809 的 Windows PE 加載項兩個exe文件下載完成后進行安裝,初始界面如圖,其余按照默認選項點擊"下一步"進行安裝就好了。
ADK 安裝界面
WindowsPE加載項 安裝界面
安裝完成后,會在開始菜單出現:
選擇"部署和映像工具環境",彈出ADK console。
執行 copype amd64 E:\Win10PE 命令,x64版本winpe就被提取出來,在 E:\Win10PE\media\sources 目錄下就會得到boot.wim文件。
修改WinPE掛載winpe在E:\Win10PE\media\sources目錄下創建boot文件夾,然后通過命令 dism /mount-wim /wimfile:"E:\Win10PE\media\sources\boot.wim" /index:1 /mountdir:"E:\Win10PE\media\sources\boot" 將boot.wim文件掛載到boot目錄。此時的目錄結構如下圖
添加中文語言支持1通過 Dism /Get-Packages /Image:"E:\Win10PE\media\sources\boot"命令查看winpe中安裝的包
WinPE中需要配置語言支持中文,否則在后面顯示中文的時候會出現亂碼問題。執行以下命令添加中文支持
添加中文語言包dism /Add-Package /Image:E:\Win10PE\media\sources\boot /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\zh-cn\lp.cab" dism /Add-Package /Image:E:\Win10PE\media\sources\boot /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\zh-cn\WinPE-HTA_zh-cn.cab" 添加中文字體包dism /Add-Package /Image:E:\Win10PE\media\sources\boot /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-FontSupport-ZH-CN.cab" 區域設置更改為使用中文dism /Set-AllIntl:zh-CN /Image:"E:\Win10PE\media\sources\boot"
安裝完成后,查看winpe中安裝的包,語言包已經安裝成功。
修改WinPE啟動后調用程序默認情況下,Winpeshl.exe 是 Windows PE 啟動時運行的第一個進程。Winpeshl.exe 在System32下搜索名為 Winpeshl.ini 的文件。Winpeshl.ini 可以控制是否將自定義shell程序加載到 Windows PE而不是默認的“命令提示符”窗口。 如果該文件不存在,Winpeshl.exe 會啟動一個執行 Startnet.cmd 腳本的 Cmd.exe 進程。 如果 Winpeshl.ini 存在并且包含要啟動的應用,則會執行這些應用而不是 Cmd.exe2。
ADK中的boot.wim掛載后,在 E:\Win10PE\media\sources\boot\Windows\System32 目錄下沒有 Winpeshl.ini 文件,需要手動創建,注意編碼格式為utf8。
Winpeshl.ini的用法可以參考官方文檔:Winpeshl.ini 參考:啟動 WinPE 時啟動應用
因為我只需要加載一個應用,所以在Winpeshl.ini中僅設置[LaunchApp]這一個條目就夠了。CustomSetup.exe是我寫的安裝程序。Winpeshl.ini 文件內容:
[LaunchApp]AppPath = %SYSTEMDRIVE%\Program Files\Custom\CustomSetup.exe開發 Windows 安裝程序
Windows PE 包含非常多的功能支持(Windows PE 功能支持),安裝程序的實現主要用到 "Windows 應用程序編程接口(API)" 和 "映像管理和維護(DISM)工具"。
這里的 Windows 安裝程序主要適用于執行自定義安裝,也就是干凈安裝。這個階段包含兩個最基本的操作,一個是配置磁盤(分區和格式化)。另外一個就是將 Windows 的映像復制到磁盤。此外,還可以添加接受License以及一些其他的配置,為用戶提供更豐富的控制接口。
我將在安裝程序中實現這兩個最基本的操作。因為是在 Windows PE 環境下執行,所以采用基本的WIN32編程來實現,不依賴于任何現有的框架。簡單添加幾個基本頁面,具體的代碼就不貼了。主要實現兩個基本功能:對硬盤驅動器進行分區和拷貝、應用系統鏡像。
硬盤分區的實現:微軟提供了一個 CreatePartitions-UEFI.txt 腳本,它將磁盤分為系統分區(S)、MSR保留分區、Windows分區(W)和恢復分區(R)。為了簡化實現,安裝程序首先查詢用戶硬盤驅動器總大小,根據用戶輸入的C盤和D盤大小,以腳本文件中內容作為模板,生成需要執行的腳本。然后執行腳本,實現硬盤分區和格式化。
鏡像拷貝和應用的實現:鏡像的拷貝和應用主要利用dism工具實現,同時,還需要設置 Windows 的引導程序以及隱藏恢復分區。
應用映像(install.wim中內容)到 Windows 分區dism /Apply-Image /ImageFile:"$drive\sources\install.wim" /Index:1 /ApplyDir:"$windowsDrive"使用bcdboot工具配置系統分區$windowsDrive\Windows\System32\bcdboot $windowsDrive\Windows /s $systemDrive將 Windows 恢復環境(winre)工具復制到恢復工具分區中mkdir $recoveryDrive\Recovery\WindowsRExcopy /h $windowsDrive\Windows\System32\Recovery\Winre.wim $recoveryDrive\Recovery\WindowsRE\注冊恢復工具的位置,然后使用 Diskpart 隱藏恢復分區$windowsDrive\Windows\System32\Reagentc /Setreimage /Path $recoveryDrive\Recovery\WindowsRE /Target $windowsDrive\Windows$windowsDrive\Windows\System32\Reagentc /Info /Target $windowsDrive\Windows
這里有一點要注意:因為在winpe環境中,除了‘x’是留給winpe虛擬盤的盤符,其他盤符是臨時分配的。所以,以上這些命令中的drive信息都是通過枚舉所有盤符獲得對應的分區。將兩部分內容封裝到安裝程序中,將開發好的CustomSetup.exe按照Winpeshl.ini文件中的內容到放到指定位置。
封裝ISO至此,Windows 安裝工具開發基本完成。通過dism /unmount-image /mountdir:"E:\Win10PE\media\sources\boot" /commit命令,卸載winpe并提交修改。利用鏡像編輯工具,將ISO文件中sources目錄下的的boot.wim替換為制作好的boot.wim文件。同時,將ISO中與安裝無關的文件刪除。如下是原始ISO文件中的目錄結構和定制安裝程序之后ISO的目錄結構:
原ISO的文件布局
新ISO的文件布局
定制鏡像的安裝效果在hyper-v中安裝新的鏡像文件,系統引導進入winpe并調用前面開發的 Windows 安裝程序,以下為安裝過程截圖。首頁模擬了windows 10 原生的安裝程序,添加了兩個logo。
要求用戶接受安裝許可條款
查詢磁盤總大小,在用戶輸入具體分配磁盤大小后,對磁盤進行分區操作。
電腦添加了一頁擴展頁,這一頁只是個示例,沒有實際操作。
下一步就是將鏡像內容復制到磁盤。
以上的操作完成以后,系統自動進行重啟,然后系統將自動引導進入OOBE過程。
至此,定制 Windows 10 安裝程序基本完成。當然,這里的重寫安裝程序只是一個探索性開始,還有很多的細節需要完善、很多的功能需要支持,如:對于硬件的兼容性檢查,評估新的系統是否適用于當前的硬件,以保證老舊的硬件能夠安裝新版的操作系統,而不是直接就去安裝;對于磁盤操作更加靈活,支持更多分區;增加網絡安裝的支持;增加無人值守安裝的支持等等。
本文最想要說明的一個想法是在系統重新引導進入 Windows 之前的安裝階段,我們可以做非常多的事情,在這個過程中可以添加非常多的頁面操作,比如說前面提到的安裝第三方軟件,讓不同安全等級的用戶選擇對應的加密模塊;在系統安裝過程中向用戶提供殺毒軟件的選擇;向用戶提供合規軟件版本列表供用戶選擇...更多的內容大家可以自己想象。
參考Add languages to images: 電腦https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-add-packages--optional-components-reference?view=windows-11#add-languages-to-images-that-include-optional-componentsWinPE: Create Apps: https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-create-apps?view=windows-11電腦