How to Upgrade Windows Clients with Multiple Languages installed to Windows 10


Consider following scenario:
Your corporate Standard Desktop Client has Multiple Language Packs installed and you have planned to go with Windows 10.

If you want to skip the introduction you can jump to the automated solution section.

You have now the following challenges:

  1. Which Language Packs are Currently installed on the Device your Upgrade Task will run?
    This can be verified using following command line
    dism.exe /Online /Get-Intl
    In this Sample we have a Windows 7 Installation with English and German Language Packs installed.
    The default OS Language is set to German (de-DE)
  2. Which Default OS UI Language is set on the device? This question is essential as Windows Setup will only provide all in place Upgrade options if the OS UI Language matches the Windows Setup Media Language used. Using an English (en-US) Windows 10 Setup Media on the sample device will provide us these options:
    This can be solved using following method:
    Boot from your Windows 10 Setup Media
    At the first screen press and hold SHIFT + F10 key to open an command prompt
    run dism.exe /image:d:\ /set-uilang:en-us against your Windows Installation (d:\ would be the drive where your Windows 7 Installation is found in Windows PE, this can be another drive letter as well depending on your Disk Partitioning)
    After a reboot of the device we can verify our change.
    Default System UI Language is now English (en-US)Running Windows Setup again on the same device allows us finally to keep personal files and settings.
    This is essential for a succesful upgrade with System Center Configuration Manager.
  3. How to include additional Language Packs during the Windows Setup Upgrade process?
    Windows 10 Setup Command Line parameters
    answers this question [/InstallLangPacks<location>]
  4. How will it be possible to configure the default user Language Settings and keep the Devices UI Language on English (en-US) for future Servicing?
    Windows Vista Command Line Configuration of International Settings has an answer for this one.


A lot of manual tasks which are not enterprise friendly. That is why I decided to provide some sample scripts and a Task Sequence Template to help our Enterprise customers archiving this goal.

Automated solution

There are two PowerShell Scripts needed plus some Condition based Task Sequence Steps to get this done.

The first script in use is OSDDetectInstalledLP.ps1 will enumerate all Languages installed and which UI Language the OS has currently.
Following variables will be Set via this Script:

  • CurrentOSLanguage – the Value will be set to the Language found. For example de-DE (German)
  • MUIdetected – the Value will be True if at least 1 additional Language is found.
  • OSDDefaultUILanguage – the Value will be set to the Language found. This will only apply if OSDRegionalSettings.ps1 script did run on this device.
  • plus Variables matching the Languages found with a Value of True. For example de-DE (German)

The second script in use OSDRegionalSettings.ps1 will configure the Regional Settings.
Following variable can be set for this Script:

  • OSDUILanguage – will set the UI Language matching the provided Value for Example de-DE (German). If Variable CurrentOSLanguage or OSDDefaultUILanguage is found it will use its Value. This is the only mandatory Variable for this script.
  • OSDUserLocale – will set UserLocale matching the provided Value for Example de-AT (Austria). Userlocale specifies the per-user settings that are used for formatting dates, times, currency, and numbers in a Windows installation.
  • OSDSystemLocale - will set SystemLocale matching the provided Value for Example de-AT (Austria). SystemLocale specifies the default language to use for non-Unicode programs.
  • OSDInputLocale – will set InputLocale matching the provided Value for Example 0c07:00000407 for German (Austria)
  • OSDGeoID – allows to configure the Geographical Location for example 14 for Austria.
    A list of valid Geographical Location values can be found here

Note each script will write a Log file which will be located in C:\Windows\CCM\Logs directory matching the Scripts name.

Download Task Sequence export:
Download OS Deployment Scripts: (updated 2017-08-10)

The Task Sequence is based on the default Template “Upgrade an Operating System from an Upgrade Package” and has been created in a System Center Configuration Manager Current Branch 1702 environment.


Following Steps with conditions have been added:

Run PowerShell Script: Detect MUI Settings
Command OSDDetectInstalledLP.ps1 with Execution policy Bypass

There is no condition set


Group: Change System UILanguage

Task Sequence Variable CurrentOSLanguage not equals en-US

Run Command Line: Supress User Logon after Reboot
Command line: powershell.exe -command "Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\smstsmgr -Name Start -Value 4 -Type DWord -Force; Set-ItemProperty -Path HKLM:\SYSTEM\Setup -Name SetupType -Value 2 -Type DWord -Force; Set-ItemProperty -Path HKLM:\SYSTEM\Setup -Name CmdLine -Value 'system32\osdsetuphook.exe /execute' -Type String -Force"

Condition: There is no condition set

Note: This is step 1 of 3 steps which will suppress the Logon Screen to the end user as long as this Task Sequence is running. In case you detect issues, disable this step before you raise a support case.

Restart Computer: Restart Computer into Windows PE

There is no condition set


Group: Apply en-US Language Pack

Task Sequence Variable MUIdetected not exists

Note: The purpose of this group is to support native localized Windows installations which have no en-US language pack installed.

Run Command Line: Appy Language Pack W7.0 x64 (en-us)
Command line: dism.exe /image:%_OSDDetectedWinDrive% /ScratchDir:%_OSDDetectedWinDir%\Temp /Add-Package /PackagePath:.\

Condition: If all conditions are met
OSArchitecture equals 64-bit
equals 6.1.7601


Note: This step requires that your Language Pack (*.cab) files are located in the root of the Package source folder.
Steps for Windows 8.1 and Windows 10 are similar, except the OSVersion 6.3.9600 for Windows 8.1 and 10.0.10586 for Windows 10 build 1511

Set Task Sequence Variable: Set Task Sequence Variable MUIdetected

Condition: There is no condition set

Note: This is required for a step Download additional Language Packs, otherwise your device will be en-US at the end.

Run Command Line: Set UILang en-US on %_OSDDetectedWinDrive%
Command line: dism /image:%_OSDDetectedWinDrive% /set-uilang:en-us
Condition: There is no condition set

Note: This will change the Windows UILanguage of the current installed OS, as described in the beginning of this article.

Run Command Line: Copy OSDSetupHook to %_OSDDetectedWinDir%

Command Line: cmd.exe /c copy %SystemDrive%\SMS\Bin\x64\osdsetuphook.exe %_OSDDetectedWinDir%\system32

Note: This is step 2 of 3 steps which will suppress the Logon Screen to the end user as long as this Task Sequence is running. In case you detect issues, disable this step before you raise a support case.


Restart Computer: Restart Computer back to Full OS

There is no condition set

Run Command Line: Re-Enable Task Sequence Service after Reboot


Command Line: powershell.exe -command "Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\smstsmgr -Name Start -Value 3 -Type DWord -Force"

Note: This is step 3 of 3 steps which will suppress the Logon Screen to the end user as long as this Task Sequence is running. In case you detect issues, disable this step before you raise a support case.

Group: Download additional Language Packs

Task Sequence Variable MUIdetected exists

Download Package Content: Download Language Pack de-DE to c:\LanguagePacks


Condition: Task Sequence Variable de-DE exists

Set Task Sequence Variable: Include Language Packs for Upgrade

Set Task Sequence Variable: OSDSetupAdditionalUpgradeOptions
Value: /InstallLangPacks c:\LanguagePacks

Condition: If folder C:\LanguagePacks exists

Upgrade Operating System: Upgrade Operating System Enterprise


Condition: Task Sequence Variable OSSKU not equals PROFESSIONAL


Note: This Task Sequence sample allows to distinguish between Professional and Enterprise Edition upgrades. It is very important for an upgrade from Professinal to Professional to provide a KMS or MAK Product Key. A lot of devices have OEM KEYS preinstalled within their Bios, which is detected from Windows Setup during the Upgrade and would cause the process to stop right after Upgrade Operating System step. A OEM KEY prevents Windows to execute the SetupComplete.cmd script which is essential in this process to re-enable the Configuration Manager client agent.

Run PowerShell Script: Set UILangage back for Logon Screen Language
Command OSDRegionalSettings.ps1 with Execution policy Bypass

Condition: Task Sequence Variable CurrentOSLanguage not equals en-US


Run Command Line: Remove c:\LanguagePacks
Command line: cmd.exe /c rd c:\LanguagePacks /s /q

Condition: If folder C:\LanguagePacks exists


Wilhelm J. Kocher
Senior PFE - EMEA

This post is provided "AS IS" with no warranties, and confers no rights. The solution is not officially supported. Any support provided by Microsoft regarding this solution may be limited. Microsoft does not guarantee the solution will work in all environments and/or scenarios.

Comments (36)

  1. Darin says:

    Very interesting article, wish I would have had this 6 months ago. Currently I have a re-compiled wim file with multiple image indexes for our various supported language packs. That way, I run a different Windows 10 upgrade depending on the detected language. I also wish that I wouldn’t have followed the MDT template to have the language packs installed before first bootup. Our root media is English, but installing the language pack offline is causing the OS to be a native install of the alternate language, and therefore the English media is not working on future upgrades, even with passing the /InstallLangPacks switch.

    I know there has to be a better way, and I think your on to something, but rebooting into WinPE to use DISM to modify the OS back to English seems like major overkill and full of risk and not a great end user experience. Not to mention you can’t even get a clean compat scan ahead of time without changing the language, so you’ll never know before hand if there’s something else that will block the upgrade.

    What would be good to figure out, is what is the dism.exe /image:d:\ /set-uilang:en-us really doing, and how do we do that to the OS while it’s up an running. And even better, maybe the Windows Setup.exe should fully support upgrading any language of OS, as long as the correct language pack file is provided. After all, seems like everything that’s needed would be there, that’s how some of us got stuck in this situation. English WIM + LP + Offline LP installation.

    1. Hi Darin,

      sorry for being too late with my article. Especially in this case where I tried to write up everything since November last year and could not find some time to do so earlier. Testing everything multiple times, chasing for feedback from users who can test languages I cannot speak myself was a bit time consuming but worth it. For example, I was not aware that a Spanish Windows returns “64-bits” and not “64-bit” if you query OSArchitecture from WMI.

      To answer your question about an option to change the System UI Language Online: This is possible but requires a reboot as well ( provides a bit more information on how to do this.). There are multiple reasons why I decided to use the offline method:
      1) I have the ability to quickly apply a matching en-us language pack if it missing on the target system.
      2) I get access to the osdsetuphook.exe binary always in the latest version as it is part of our boot image (just me being lazy)

      Maybe you want to modify my OSDReginalSettings.ps1 script which allows you to change regional settings of a running OS (requires a running task sequence and the variables set like described in the article) to archive this. If you decide to create just a static XML and apply it be aware that changing the System UI Language will change the LongonScreen Display Language as well which can be solved by using the Set-WinUILanguageOverride Powershell command (just ensure to run it as local system :-)).

      I hope you still can find some ideas or take away of this article. Feedback regarding improvements or issue reports are always welcome. Some of my DSE customers are using this method now since February last year and we did not discover any issues with applications or internal tools.

      My initial plan was to provide this challenge as blog post series and cover Servicing as well, but a Partner of us already wrote an awesome way how to do this I can confirm it works like a charm as both of us did work for the same customer where this solution was born. I love the idea to abuse Compliance checks to download content via BITS.

      Happy upgrading,

      1. Hi Wilhelm,

        You wrote:
        “To answer your question about an option to change the System UI Language Online: This is possible but requires a reboot as well ( provides a bit more information on how to do this.).”

        I tested several Scenarios, and it seems, that this is not possible without booting into WinPE. If I use the command “control.exe intl.cpl,, /f:”c:\temp\file.xml” and set all the needed language settings, the “Default system UI language” will remain after Reboot. Did you test that, or was it just a assumption?


        1. Frank Rojas says:

          Everything in the blog has been tested.

        2. Hi Patrick,

          it does work but to really repro the Configuration Manager environment you can use psexec.exe from Sysinternals and run the command as “local system”. To be a bit more precise you need an XML file to change regional settings of the current user which should be applied in an elevated command prompt as local system. I hope this helps.


  2. Eric says:

    The Windows updates should handle this automatically and make the switch for you. They should also have a way to automatically install the updated MUI packs. Go to UserVoice and upvote the suggestion “Install new Windows Feature Builds when using Multiple Language Packs”. We are 2 years in on Windows 10 and still the upgrade process we have to do every 6 months is problematic and requires lots of workarounds like this one. SCCM supports Windows 10 Servicing but no one can use it because you have to make all these customizations that should be included by default.

    1. Frank Rojas says:

      ConfigMgr is limited by the in-place upgrade process in Windows 10 setup, so there are not really changes that can be done in ConfigMgr to achieve the goal you are proposing in the UserVoice item. With that said the Windows team is aware of the challenges with language packs and are exploring methods to improve the experience in future versions of Windows 10. Once those improvements are made, ConfigMgr will take advantage of those improvements. In the meantime, the solution in this blog should resolve the issue in an automated fashion.

  3. Cordell says:

    I am very interested in 3 steps to supress user logon, however, I cannot seem to get it to work. I paused the TS and verified that the reg keys are being correctly set after step 1 but then on reboot the logon screen is there and I can log back in. Is there more documentation on this? Thanks!

    1. Frank Rojas says:

      The method being used to accomplish that is “experimental” and a bit of a hack, so no there is no documentation on it. It’s the reason disclaimers are given regarding this method.

      1. Cordell says:

        Thank you for your quick reply, Frank. I know you are quite experienced at deep dive in task sequence troubleshooting (smile)… do you know of any way to supress user logon during In Place Upgrade task sequence? Thanks again.

        1. Frank Rojas says:

          Besides the unsupported way we documented in this article, no we are not aware of any other method. Sorry. 🙁

        2. Dan says:

          You could try using legal notice text and set it in the registry. It won’t block logon but you can inform users that update is in progress and inform them not to login. At the end of the TS you can remove the registry values.

  4. ANI_Admin says:

    Hi Wilhelm,

    Thanks for sharing such use full article, many administrator are facing issue with language pack while doing the In-place upgrade this article will help a lot. i have followed the steps you have mentioned in article but by task sequence failed on Restart computer in Winpe step. any help would be appreciated.

    1. Frank Rojas says:

      Due to the complexity of the issue and solution and the lack of information provided, please open a case so we can properly investigate. Thank you.

  5. Dan says:

    Hi, I am testing this and i think i might have found an issue with the OSDDetectInstalledLP. Using the registry values found in HKLM:\SOFTWARE\Classes\MIME\Database\Rfc1766 for Swedish causes UI language to be set to sv-sv and that does not work as inteded. It should be set to sv-SE. I think i will try changing the script using get-uiculture instead.

    1. Dan says:

      I can confirm replacing the section reading registry and parsing the values and then saving to the variable $CurrentOSLanguage fixed the issue. All i do instead is $CurrentOSLanguage = (get-uiculture).Name. It will need further testing but initialy it looks good. And for more information i am only testing this going from Win10 1511 > 1607.

      1. Hey Dan,
        thanks a lot for your feedback! Great catch and it works on Windows 7 as well. I will test it and update the script. I hope you like the solution and works otherwise for your needs.

        1. Dan says:

          No problem. Glad to help. Yes it is a nice solution i really appreciate you sharing it. I do have another challange and that is that customer is using a 802.1x authentication on the network and when the client reboots to winpe it won’t authenticate. 🙂

          / Dan

      2. Joakim Tomren says:

        I am running on Win10 1607 with offline Language pack install. Using the get-uiculture when i have Korean og Chiense languagepack activated i always get en-us. I ended up changing to get-culture.

        1. Joakim Tomren says:

          To support zh-CN, ja-JP and ko-KR i ender up doing the following instead:
          $CurrentMUIlanguage = (Get-ItemProperty “hkcu:\Control Panel\Desktop\MuiCached”).’MachinePreferredUILanguages’
          $CurrentOSLanguage = “$CurrentMUIlanguage”

  6. Seppo says:

    Hello Wilhelm!
    I´m trying to implement your Task Sequence to our environment to perform upgrade from W10 1607 -> 1703. Default system UI language for target 1607 PC´s is Finnish (fi-FI) so the second step in your TS template should kick in. But for some reason, the TS proceeds straight to “Upgrade the Operating System” TS Group after running the first step “Check Readiness for Update”. Windows Setup of course fails because of the different default system UI lang than expected.

    Any idea why this happens? As there are no conditions for the Check Readiness step, I´m confused why it does not proceed to step 2 “Detect MUI Settings”. At least this is what I understood from the smsts.log, there it says “Check Readiness for Update” completed successfully, then a few lines of set global variables and then it says “The group (Prepare for Upgrade) has been successfully completed”. Even though only the first step of this group has been performed.

    Our SCCM is still 1606, acknowledge it is older than where you´ve created the template I imported. Could this be the cause?

    1. Seppo says:

      I´ll answer to myself 🙂 I created an exact copy of your template step by step and now it runs as expected. So I believe something happened at the TS import, maybe caused by the SCCM version mismatch.

      Million thanks for this guide, absolutely essential to our environment and helps us to proceed with W10 Servicing plans!

  7. NK says:

    Executing command line: “C:\_SMSTaskSequence\Packages\DRY00427\SETUP.EXE” /ImageIndex 1 /auto Upgrade /quiet /noreboot /postoobe “C:\WINDOWS\SMSTSPostUpgrade\SetupComplete.cmd” /postrollback “C:\WINDOWS\SMSTSPostUpgrade\SetupRollback.cmd” /DynamicUpdate Disable /compat IgnoreWarning /compat ScanOnly

    Windows Setup completed with exit code hexadecimal 0xC1900100 (decimal 3247440128)

    Saving exit code of Windows upgrade – hexadecimal 0xC1900100 (decimal 3247440128) – to Task sequence environment variable ‘_SMSTSOSUpgradeActionReturnCode’, as decimal string

    Windows setup in ‘scanOnly’ mode returned exit code hexadecimal 0xC1900100 ( decimal 3247440128) . Failing task sequence step.

    Failed to run the action: Upgrade Operating System Enterprise.
    Unspecified error (Error: 80004005; Source: Windows)

    The execution of the group (Upgrade the Operating System) has failed and the execution has been aborted. An action failed.
    Operation aborted (Error: 80004004; Source: Windows)

    Hi Wilhelm,

    I got this error when it Upgrades

    Can you help on this

    1. Hi NK,

      please check which should help you finding the issue. I would take a look at setupact.log to find the cause for it.


  8. James Leroux says:

    This is really excellent. Ive got a cut down version of this running now, and the next step will be to figure out how to allow the TS to prestage the content even if the upgrade image mismatches the localy installed OS… I’m thinking of just repackaging the upgrade image source files into a dumb package and just running the setup command line manualy.. Hopefully i can get this working with the image update servicing too. Seems like we have to subvert and manipulate everything to get things exactly how i like em. 😉

    1. Hi James,
      sorry for the late reply. Maybe Steve’s blog post about SMSTSDownloadProgram inspires you. It does allow you to gather content from other locations with all content hash verification.

  9. thePhiBu says:

    Hi there,

    I´m having an Issue with this Method on an Update from Windows 7 .
    After the WinPE Phase, changing the language to en-us, the Computer Rbeoots into a black screen with the cursor visible but nothing happens.

    I´ve disabled the step 1/2/3 as mentioned in the guide, but still the same Issue.
    Only thing i can do is reboot, which brings up the same screen over and over again.

    Only way to get it back where it was before is using a restore Point.
    Any Ideas?

    1. Hi Phillip, is it possible that your device requires a BIOS Update or that the system does not support the NX Bit?
      You can use CoreInfo.exe to verify if your System Supports the NX Bit
      Starting with Windows 8 the NX Bit is a pre-requisite of Windows®
      NX helps your processor guard the PC from attacks by malicious software.

      I hope this help!

      1. thePhiBu says:

        Hi again,

        It´s a Dell Modell 7450, so this is fine. I´ve checked the NX bit and it´s set and fine.
        Upgrading using a different Task Sequence to WIndows 10 1607 is working, however i want to utilize the language Features in this Upgrade Sequence.
        In the SCCM Log: The task sequence execution engine successfully completed the action (Restart Computer back to Full OS)
        But then it just stops. So it´s not during the WIndows 10 Upgrade.

        Still fiddling around with it…

        1. Hello,

          Just for me to better understand your current state. How is the configuration you start with? A native Windows 7 install in a specific language or is it a base OS with an additional LP installed? Can you share the content of your OSDDetectInstalledLP.log file should be located in c:\Windows\CCM\Logs directory.


  10. P. Splinter says:

    thanks for MUI script, I’m using it now for migrate pcs but sometimes I encounter issues with the OSDStartLayout.ps1 script.
    it create the error after creating the shortcut for user profile. the specified path, filename or both are too long. it is still processing but just takes hours. can you check this issue ?

    1. Hi,

      there is an issue in my script caused by a user profile “defaultuser0” which is part of the Setup Media since build 1703. To fix the problem please update or replace the line with [array]$UserProfiles to match this one:
      [array]$UserProfiles = Get-WMIObject -Class Win32_UserProfile | Where-Object{!($_.Localpath -match “Windows”) -AND !($_.Localpath -match “defaultuser0”)}
      This should filter out the problematic not existing profile causing the timeout problem.

      I hope this helps,

      1. P. Splinter says:

        Hello Willelm,

        thanks for your reply. I have tested with the adjustments and that is working fine and we moving this almost to production, but I also encounter this error with the script, but im not able to repro the issue.
        Create Shortcut C:\Users\.NET v4.5 ClassicAppPoolApp… and this path gets long 🙂
        C:\Users\DefaultAppPool and this also
        any idea what happened or that the adjust will prevent this.


  11. RyanDtan says:

    Hi Wilhelm,

    Need some help.
    Condition “MUIdetected not exists” is not working, change MUIdetected equals to “True”, it works. Where does these two variable came from: %_OSDDetectedWinDrive%” and “%_OSDDetectedWinDir%”

    1. Hi,

      The MUIdetected variable is set via my OSDDetectInstalledLP.ps1 PowerShell script. The other variable %_OSDDetectedWinDrive% is set in Windows PE phase out of the box if the TS environment is able to find a Windows Installation on any of the build in hard drives. You can find it documented at .

Skip to main content