Buy Me A Coffee

Some notes on creating a custom Windows 10 installation ISO image

Created: June 14, 2020   Last Modified: November 27, 2021   Category: windows   Print this pageBack to Home


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.

To install Microsoft Office, you can use Office Deployment Tool . The detailed instruction is here. I recommend you to download all necessary files before installation by running setup.exe /download <path-to-configuration-file> as Administrator. Here is an example of my configuration file configuration.xml for installing Microsoft Office 2021 Professional Plus Retail with only Word, Excel, and PowerPoint. To perform the installation, simply run setup.exe /configure configuration.xml as Administrator. See also a list of Product IDs. Remember to replace <your-25-characters-product-key> with the product key you purchased.


  <Add OfficeClientEdition="64" Channel="Current">
    <Product ID="ProPlus2021Retail" PIDKEY="<your-25-characters-product-key>">
      <Language ID="en-us" />
      <ExcludeApp ID="Access" />
      <ExcludeApp ID="Groove" />
      <ExcludeApp ID="Lync" />
      <ExcludeApp ID="OneDrive" />
      <ExcludeApp ID="OneNote" />
      <ExcludeApp ID="Outlook" />
      <ExcludeApp ID="Publisher" />
      <ExcludeApp ID="Teams" />

  <Property Name="AUTOACTIVATE" Value="1" />

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 .Appx (or .AppxBundle, and so on) file along with a .BlockMap file. For example, in my case, I downloaded FACEBOOK.317180B0BB486_550.7.119.0_x64__8xx8rvfyw5nnt.appx and FACEBOOK.317180B0BB486_550.7.119.0_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_550.7.119.0_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 (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 .\lang\ja-jp and .\lang\vi-vn folders.)

dism /Online /Add-Package /PackagePath:".\lang\ja-jp\"
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~" /CapabilityName:"Language.Handwriting~~~ja-JP~" /CapabilityName:"Language.OCR~~~ja-JP~" /CapabilityName:"Language.Speech~~~ja-JP~" /CapabilityName:"Language.TextToSpeech~~~ja-JP~" /Source:".\lang\ja-jp\"
dism /Online /Add-Package /PackagePath:".\lang\vi-vn\"
dism /Online /Add-ProvisionedAppxPackage /PackagePath:".\lang\vi-vn\" /LicensePath:".\lang\vi-vn\License.xml"
dism /Online /Add-Capability /CapabilityName:"Language.Basic~~~vi-VN~" /CapabilityName:"Language.TextToSpeech~~~vi-VN~" /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

An useful toolkit for customizing your Windows installation is Win Toolkit. You may also need DiskInternals’ Linux Reader to read Linux file systems such as ext4.