This post contains some notes which I want to remember when creating a custom Windows 10 installation ISO image.
This post is a very clear guide on how to create a custom Windows 10 installation ISO image. It is also possible to create an ISO with multiple Windows 10 images and multilingual support. This page contains several links to original Windows 10 installation ISO images, and you can verify the downloaded images by seeking their SHA1SUMs here. I use the ISO image of
Windows 10 Version 2004 - 20H1 (build 19041.264) as the original one.
It took me some time to figure out how to install apps in Windows 10 for all users. (For installing softwares, I use chocolatey. Another option might be the Windows Package Manager Client (aka winget).) Basically, say, if I want to install Facebook Messenger, I go to this page, paste the link from the Microsoft Store to get avaiable links for downloading the app for offline installation. Usually, you will have to download the
.AppxBundle, and so on) file along with a
.BlockMap file. For example, in my case, I downloaded
FACEBOOK.317180B0BB486_518.104.22.168_x64__8xx8rvfyw5nnt.BlockMap files. Then, to install the app, open PowerShell as admin, move to the folder containing the downloaded files, and run
Add-AppxProvisionedPackage -Online -SkipLicense -PackagePath .\FACEBOOK.317180B0BB486_522.214.171.124_x64__8xx8rvfyw5nnt.appx. Some package like Microsoft Whiteboard appears with its dependent packages when seeking download links, and you should also download and install them also. More information on the
Add-AppxProvisionedPackage command can be found here.
Unfortunately, I have no idea why the Facebook Messenger app is not available for all users, while other apps, like Microsoft Whiteboard, are. A better way is to add apps to
install.wim as described here.
Here is the command I used to install Microsoft Whiteboard.
dism /Online /Add-ProvisionedAppxPackage /PackagePath:".\Microsoft.Whiteboard_20.10518.5186.0_x64__8wekyb3d8bbwe.Appx" /DependencyPackagePath:".\Microsoft.NET.Native.Framework.2.2_2.2.27912.0_x64__8wekyb3d8bbwe.Appx" /DependencyPackagePath:".\Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__8wekyb3d8bbwe.Appx" /DependencyPackagePath:".\Microsoft.VCLibs.140.00_14.0.27810.0_x64__8wekyb3d8bbwe.Appx" /SkipLicense
Another problem is to install language packs and their additional features. This post was quite useful for me. Basically, you will have to download a language interface package in
.Appx format and several
.cab files, as described in details here. You may search for avaialble packages (note that I will need the build number to be at least newer than
19041.264, since I use this build as my original installation) at uupdump.ml (for instance, like this). At this page, the language pack may have extension
.esd, and you can convert it to
.cab with this small commandline tool. Finally, to install
.cab files, use the command
dism /Online /Add-Package /PackagePath:\path\to\your\cab. Here is an example of how I install Japanese and Vietnamese language packs and their features. (All packages are placed at the
dism /Online /Add-Package /PackagePath:".\lang\ja-jp\microsoft-windows-client-languagepack-package_ja-jp-amd64-ja-jp.cab" dism /Online /Add-ProvisionedAppxPackage /PackagePath:".\lang\ja-jp\LanguageExperiencePack.ja-JP.Neutral.appx" /LicensePath:".\lang\ja-jp\License.xml" dism /Online /Add-Capability /CapabilityName:"Language.Basic~~~ja-JP~0.0.1.0" /CapabilityName:"Language.Handwriting~~~ja-JP~0.0.1.0" /CapabilityName:"Language.OCR~~~ja-JP~0.0.1.0" /CapabilityName:"Language.Speech~~~ja-JP~0.0.1.0" /CapabilityName:"Language.TextToSpeech~~~ja-JP~0.0.1.0" /Source:".\lang\ja-jp\" dism /Online /Add-Package /PackagePath:".\lang\vi-vn\microsoft-windows-client-languagepack-package_vi-vn-amd64-vi-vn.cab" dism /Online /Add-ProvisionedAppxPackage /PackagePath:".\lang\vi-vn\LanguageExperiencePack.vi-VN.Neutral.appx" /LicensePath:".\lang\vi-vn\License.xml" dism /Online /Add-Capability /CapabilityName:"Language.Basic~~~vi-VN~0.0.1.0" /CapabilityName:"Language.TextToSpeech~~~vi-VN~0.0.1.0" /Source:".\lang\vi-vn\"
It is required to enable the block clean-up of unused language packs setting; otherwise, Windows 10 will uninstall unused language packs which are not added to any user. Also, I added the line
PowerShell -Command "$A = Get-WinUserLanguageList; $A.Add('ja-jp'); $A.Add('vi-vn'); Set-WinUserLanguageList $A -force" to the
RunOnce.bat file (created as in this tutorial) to initiate language packages at the first time a user login (see this page for more details).
You can also perform many other settings, like