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