Retaining Multi-Language Settings for Windows 10 in-place Upgrades

Posted: March 17, 2017 in Windows 10
Tags: , , , , , , , ,

Credit goes to J v D on the myITforum Configuration Manager email list for his response to my question about how to resolve this. I have adapted elements of his solution to suit my own situation.

Lately I’ve been doing a lot of Windows 10 1607 deployments some of which have been in-place upgrades from Windows 7 and Windows 10 1511.

I noticed that my multi-language settings were not being migrated as part of this process.





So how do you resolve this issue? Well I’ve finally found a suitable and reliable way of setting these values as part of a Configuration Manager in-place upgrade Task Sequence.

Some background on why this problem has occurred.

For Windows 10, I like others have used the English (US) ISO.  I’ve then added the en-GB language pack for English (Australian) language support as part of a Configuration Manager Task Sequence. For Windows 7 we have always used the media with English (US) as the base system language.

This is important to note as you can’t in-place upgrade an existing OS using Windows 10 media from another base system language i.e. you wouldn’t be able to in-place upgrade a Windows 7 OS using a base system language of en-US with say the Windows 10 en-GB media.

The combination of this multi-language environment has resulted in the subsequent Windows 10 1607 language settings not being correctly configured for the welcome screen or for new user accounts following in-place upgrades.


1. Add a  Run Command Line step in your in-place upgrade Task Sequence that references your language package. This adds the relevant Language Pack and Feature on Demand cab files. This is the same process that you would undertake if you were preparing a reference image. As an example you could use a cmd file that contains the following (adjust for your language):



2. Create the following SetLanguage.xml file and adjust as per your requirements. This xml file is imported as part of a scheduled task that gets created later in the sequence. I would recommend using Notepad++ to error check the file and then test it by manually running the import command in step 3. This way you can be confident that it is working before moving to testing with in-place upgrades.


3. Create the following PostUpgrade.cmd file. This cmd file is run as part of a step in the task sequence.


4. Create a new package in Configuration Manger containing these 2 script files and call it something appropriate.


5. Modify your existing in-place upgrade Task Sequence to include the following 3 steps.


SMTSPostAction with a value of cmd /c shutdown /r /t 0 /f


Command line of xcopy * “c:\Windows\Temp” /D /E /C /I /Q /H /R /Y /S


Command line of: schtasks /create /tn “PostUpgradeTask” /tr “c:\Windows\Temp\PostUpgrade.cmd” /RU SYSTEM /SC onstart

These sequence steps copy the script files to c:\Windows\Temp, then create a scheduled task. Finally the SMTSPostAction restarts the PC after the sequence has finished running so that the scheduled task executes and runs PostUpgrade.cmd. This cmd is responsible for importing the adjusted language settings.

There you have it, once implemented you should have a working solution and your language settings should match what was set in the previous version of Windows 10.





  1. Hi Damon,

    Thank you. Very nice article. Is there any way we can use this solution after installing WSUS patch for 1607 update ? I have tried dism online however doesn’t seem to be working

    • Damon Johns says:

      Apologies for the late reply, yes I have seen instances where the indexing still stops working after installing a further cumulative update. I haven’t seen any resolution to this issue in 1607. However the issue is resolved in 1703 so I would encourage you to look at deploying this version.


      • Thank you Damon, we currently planning to go from 1511 to 1607 only. Later in future we need to look into 1703. we are planning to rollout update package to the devices and running setupconfig.ini to call powershell script whit modification. It seems that everything working as expected apart from this language pack issue. I am using windows-addpackage cmdlet to install language pack and then running script to import setlang.xml. But it doesn’t work. any suggestions ?

  2. Hi Damon,

    Thanks for the post, it’s got display options working for us. One remaining issue I have now is that this sets the default keyboard to be English (UK) for existing profiles. Easy enough for the user to change but I was wondering if you have come across this and have a way to fix it via script?


    • Apologies, should have been clear – this is going to 1703.1 (Creator’s Update, Current Branch for Business)

    • Damon Johns says:

      Hi Dean, yes I’m seeing that in my environment also however as we only use in-place upgrade for highly configured PC’s we are just making information available for our clients / techs so they can make the change manually. 95% of our Windows 7 upgrades are wipe and load with USMT.

      • I think I may have got a workaround to allow upgrades in place, without needing a wipe and load. I’ve used the PS App Deployment Toolkit, it has a function (Invoke-HKCURegistrySettingsForAllUsers) that updates the default user hive and then mounts the user hive for every profile on the system and sets the same keys/values. Setup a package with PADT an am running it in the TS after installing the correct language/feature packs. I put the following lines in the included ps1 script (seems to be what changes between en-US and en-AU). Running another VM upgrade now to confirm, but it looks like a winner!

        [scriptblock]$HKCURegistrySettings = {
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “Locale” -Value “00000C09” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “LocaleName” -Value “en-AU” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “sCountry” -Value “Australia” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “sLanguage” -Value “ENA” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “sLongDate” -Value “dddd, d MMMM yyyy” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “sShortDate” -Value “d/MM/yyyy” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “iCountry” -Value “61” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “iDate” -Value “1” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “iFirstDayofWeek” -Value “0” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “iMeasure” -Value “0” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “iNegCurr” -Value “1” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International” -Name “iPaperSize” -Value “9” -Type String -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International\User Profile” -Name “Languages” -Value “en-AU” -Type MultiString -SID $UserProfile.SID
        Set-RegistryKey -Key “HKCU\Control Panel\International\User Profile\en-AU” -Name “0C09:00000409” -Value 1 -Type Dword -SID $UserProfile.SID
        Remove-RegistryKey -Key “HKCU\Control Panel\International\User Profile\en-US” -SID $UserProfile.SID

        Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $HKCURegistrySettings

  3. Damon Johns says:

    That’s awesome mate. You should do a quick blog on it 😉 well done!

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s