Don't Overcomplicate Your Task Sequence
In the recent years I've had my share of overly complicated and difficult to manage task sequences. As it is still widely used, I thoughg I'd write a post on what changes and enhancements brought stability along with reliability.
"There is no need for special things to succesfully stage a computer". I just made that up, but it IS true. 😄
General Steps
- Prepare the device (e.g. BIOS)
- Partition Disk
- Install OS
- Join to the domain
- Apply general settings
- Install drivers
- Install CU
- Reboot (until now, device was in Windows PE)
- Install Apps
- Reboot and handover to the user
DOs and DON'Ts
- Strive for zero-touch
There should be no need for your field techs to login post staging. If done right, once the Task Sequence finishes, you will have a laptop that is ready to be handed over to the end-user. - Make sure your users get a patched device. Cumulative updates are really easy to inject into a task sequence.
- If you have a multilingual environment, re-apply the CU after you installed the Language Pack - otherwise blue screens will haunt you and your users too!
- Don't package PS1 scripts into packages and run them from there. It's very difficult to troubleshoot. Also - do NOT convert PS1 scripts to exe, then package them and run the exe from a TS step. It's even worse to troubleshoot!
- Don't hack the registry - use GPOs and use WMI filters or OUs to target the devices properly with the appropriate GPO objects.
Recommended Tools
- UI++
https://uiplusplus.configmgrftw.com/
With the help of UI++ and a properly written XML config you can turn off PXE boot passwords, eliminate the need to select a TS from a list of available ones, pre-set location, keyboard, naming convention all though one file that can reside on an internal webserver for easy modification - TSBackground
https://onevinn.schrewelius.it/Apps01.html
Big THANKS to Johan Schrewelius from OneVinn for this tool. TSBackground gives the TS a pretty face. It can display progess bar, time passed, network info, last package source used, distribution point used and anything you fancy really, as long as it is stored in a TSVariable.
A very good writeup available here:
https://ccmexec.com/2019/06/tsbackground-for-configmgr/ - MS Website for the TS variables
https://learn.microsoft.com/en-us/mem/configmgr/osd/understand/task-sequence-variables
If you cannot find everything you need here, refer to UI++. You might just be able to do it with custom setup.
UI++ Example - This is the essence of it all
UI++ essentailly builds a set of TSvariables for you. These are then passed to the Task Sequence. If all goes well, ConfigMgr just picks the values and you get a perfectly configured computer!
The UI++ config at the end of the article should get you started. Copy it to Notepad++ and save it as XML. To test it run:
"UI++64.exe" /config:<path to the xml files>
I host the config on the ConfigMgr Site Server's IIS, this is convenient and I don't need to incorporate it into the Boot image this way. That is where UI++ is actually launched from as a prestart command:
To modify the configuration to your needs you can run UI++ on any Windows machine locally. It creates a debug log too, to tell you about mistakes/typeos.
On any UI++ screen Ctrl+F2 can be used to check what variables are set and to which values. Please actively study the UI++ documentation, it's really good! Unfortunately the forum seems to have been taken down. 😦
UI++ can read tons of data upfront. I only need Asset and Net but feel free to configure it according to your requirements.
https://uiplusplus.configmgrftw.com/docs/reference/actionelements.html#defaultvalues
Pre-Flight checks are Dell-related, but it can easily be adopted for Lenovo or HP, etc. I also check for AC power connected, and notify the tech if the device is generally not supported. This is a good time to stop the staging altogether if your tests determine the device to be rogue.
My example has 4 sites. New York, Tokyo, London, Paris. Copy the whole section and modify it if you need more.
Sites can be auto-determined based on IP-ranges (e.g. Boundaries). This saves techs a click or two and it's nice. Once the device got an IP and UI++ reads it, it can auto-select New-York from your list of sites. Neat.
A regex builder from this site helps greatly with IP address regex:
https://www.analyticsmarket.com/freetools/ipregex/
(I used 192.168.0.1 - 192.168.5.200 as an example for London below)
It is strongly recommended to authenticate the users who are allowed to run PXE boot and stage devices. Add them to an AD group and force them to login. Check lines 53-60 - they are commented out.
I selected the TEST Win11 TS for NYC and I want to change the default language and keyboard layout. Imagine our user who'd like a French GUI with a Portuguese Brazilian keyboard at Central Park:
All changes saved - naming set to NYCX<serial>, domain will be our americas one, GUI is French, keyboard is Pt-br:
And now the magic Ctrl+F2 (which can be disabled). But let's see what we did so far! The Editable tab lists the variables we just 'edited' with UI++! And you actually can click and edit them here too!
- I did indeed want to change those defaults. Selected NYC, Win11 test, French GUI, Portuguese keyboard, everything is there!
- KeybCodes, KeybList, LangCodes, LangList are paired ORDERED lists. They MUST coincide, otherwise your selection will mismatch.
- Anything starting with OSD are native to ConfigMgr and we just set them to our needs. Local admin pwd is generated based on the device's serial, but only valid unil you manage that with LAPS anyway
- Note that we selected the TEST Win11 TS, this is reflected in the SMSTSPreferredAdvertID - SCD0003 will be used accordinly (TS_List, TS_Codes)
- Variables starting with X are ones that UI++ read out from the device and can be freely used - for example as I generated a random local admin pwd.
A BONUS Trick
There's an ITServiceCode variable at the top of the list above.
Some steps take a long time to complete during staging. One example is installing Office, another is injecting the Cumulative Update. This variable can be used to skip some steps if you are testing something. You can even skip all app installs, up to you!
The default setting above is '0000' but you could use any pincode and use a condition in the TS. Below I am skipping the Cumulative Update step with the pin 4367.
For TSBackground to kick in, there are a few additional steps as well as a separate config file to change the 'wallpaper' as the Task Sequence progresses. But even with zero modificatons the out of the box config should give you a lot more plesant experience than ConfigMgr's default visuals.
Happy staging! 🙂
<?xml version="1.0" encoding="utf-8"?>
<UIpp Title="OS Deployment" Icon="x:\sms\PKG\sms10000\UIpp\mylogo.ico" Color="#444444">
<Actions>
<Action Type="DefaultValues" ValueTypes="Asset,Net"/>
<ActionGroup Name="MAIN THREAD">
<!-- NON DELL CHECK - BREAKOUT -->
<ActionGroup Name="CheckDell" Condition='InStr(1,"%XHWManufacturer%","Dell",1) < 1'>
<Action Type="Info" Name="Non Dell Warning" Title="!! WARNING !!" Image="x:\sms\PKG\sms10000\UIpp\<mycompany>.jpg" ShowCancel="True">
<![CDATA[You are trying to image a non-Dell computer. This is not supported, continue at your own risk!]]>
<Action Type="Preflight" Title="System checks" ShowBack="True" ShowOnFailureOnly="True">
<Check Text="Manufactured by Dell" CheckCondition='InStr(1,"%XHWManufacturer%","Dell",1) > 0' ErrorDescription="Not a Dell Computer, imaging is not supported" />
</Action>
</Action>
</ActionGroup>
<!-- Determine default site based on IP Range -->
<Action Type="Switch" OnValue="%XIPAddress%" DontEval="False" >
<!-- London -->
<Case RegEx="^192\.168\.(0\.([1-9]|[1-9]\d|[12]\d\d)|5\.([1-9]?\d|1\d\d|200)|[1-4]\.([1-9]?\d|[12]\d\d))$">
<Variable Name="OSDSite">"LON"</Variable>
<Variable Name="SelectedSite">"LON - London"</Variable>
<Variable Name="LogonDomain">"europe.mycompany.bla"</Variable>
</Case>
<!-- New York -->
<Case RegEx="">
<Variable Name="OSDSite">"NYC"</Variable>
<Variable Name="SelectedSite">"NYC - New York"</Variable>
<Variable Name="LogonDomain">"americas.mycompany.bla"</Variable>
</Case>
<!-- Paris -->
<Case RegEx="">
<Variable Name="OSDSite">"PAR"</Variable>
<Variable Name="SelectedSite">"PAR - Paris"</Variable>
<Variable Name="LogonDomain">"europe.mycompany.bla"</Variable>
</Case>
<!-- Tokyo -->
<Case RegEx="">
<Variable Name="OSDSite">"TKY"</Variable>
<Variable Name="SelectedSite">"TKY - Tokyo"</Variable>
<Variable Name="LogonDomain">"asiapac.mycompany.bla"</Variable>
</Case>
</Action>
<!-- Start main thread -->
<!-- USER
<Action Type="UserAuth" Title="Admin account login:" Domain="%LogonDomain%" GetGroups="True" MaxRetryCount="5" DisableCancel="True" Group="role_PCStaging" >
<Field Name="Username" Prompt="Enter your Admin user" Hint="adm...." RegEx="[Aa][Dd][Mm][\w]+" />
<Field Name="Domain" List="europe.mycompany.bla,americas.mycompany.bla" AutoComplete="true"/>
</Action>
AUTH -->
<!-- Startup Screen -->
<Action Type="Info" Name="Startup" Title="Welcome %XAuthenticatedUserDisplayName%!" Image="x:\sms\PKG\sms10000\UIpp\<mycompany>.jpg" ShowCancel="False" Timeout="0" TimeoutAction="Continue">
<![CDATA[<MyCompany> OS Deployment is now <b>interactive</b> and customized!<br><br>
<b>Model:</b> %XHWModel%<br>
<b>Chassis:</b> %XHWChassisType%<br>
<b>Serial:</b> %XHWSerialNumber%<br>
<b>IP Address:</b> %XIPAddress%<br>
]]>
</Action>
<!-- SET PREFERRED TASK SEQUENCE DEPLOYMENT ID AND SERVICE CODE -->
<Action Type="TSVar" Variable="TS_List">"PROD Win10 22H2,PROD Win11 22H2, TEST Win11 23H2"</Action>
<Action Type="TSVar" Variable="TS_Codes">"SCD0001,SCD0002,SCD0003"</Action>
<Action Type="TSVar" Variable="ITServiceCode">"0000"</Action>
<Action Type="TSVar" Variable="SelectedTS">"SCD0001"</Action>
<!-- Check LATITUDE SUPPORT -->
<ActionGroup Name="Latitude Branch" Condition='InStr(1,"%XHWModel%","Latitude",1) > 0'>
<Action Type="DefaultValues" ValueTypes=" Asset" />
<Action Type="Preflight" Title="System checks" ShowBack="True" ShowOnFailureOnly="True">
<Check Text="AC Power Connected" CheckCondition='"%XOnBattery%" = "False"' Retry="true" RetryVariable="XONBattery" ErrorDescription="Only systems connected to AC power can be imaged"/>
<Check Text="Manufactured by Dell" CheckCondition='InStr(1,"%XHWManufacturer%","Dell",1) > 0' ErrorDescription="Not a Dell Computer, imaging is not supported" />
<Check Text="%XHWModel% is Supported" CheckCondition='
InStr(1,"%XHWModel%","5285",1) > 0 Or
InStr(1,"%XHWModel%","5300",1) > 0 Or
InStr(1,"%XHWModel%","7440",1) > 0 Or
InStr(1,"%XHWModel%","7450",1) > 0' ErrorDescription="Current Image does not support this model, reach out to the IT Team" />
</Action>
</ActionGroup>
<!-- Check OPTIPLEX SUPPORT -->
<ActionGroup Name="Optiplex branch" Condition='InStr(1,"%XHWModel%","Optiplex",1) > 0'>
<Action Type="DefaultValues" ValueTypes="Asset"/>
<Action Type="Preflight" Title="System checks" ShowBack="True" ShowOnFailureOnly="True">
<Check Text="Manufactured by Dell" CheckCondition='InStr(1,"%XHWManufacturer%","Dell",1) > 0' ErrorDescription="Not a Dell Computer, imaging is not supported" />
<Check Text="%XHWModel% is Supported" CheckCondition='
InStr(1,"%XHWModel%","3040",1) > 0 Or
InStr(1,"%XHWModel%","5090",1) > 0 Or
InStr(1,"%XHWModel%","7010",1) > 0 Or
InStr(1,"%XHWModel%","7060",1) > 0 Or
InStr(1,"%XHWModel%","7070",1) > 0' ErrorDescription="Current Image does not support this model, reach out to the IT Team" />
</Action>
</ActionGroup>
<!-- Check PRECISION SUPPORT -->
<ActionGroup Name="Precision branch" Condition='InStr(1,"%XHWModel%","Precision",1) > 0'>
<Action Type="DefaultValues" ValueTypes="Asset"/>
<Action Type="Preflight" Title="System checks" ShowBack="True" ShowOnFailureOnly="True">
<Check Text="AC Power Connected" CheckCondition='"%XOnBattery%" = "False"' Retry="true" RetryVariable="XONBattery" ErrorDescription="Only systems connected to AC power can be imaged"/>
<Check Text="Manufactured by Dell" CheckCondition='InStr(1,"%XHWManufacturer%","Dell",1) > 0' ErrorDescription="Not a Dell Computer, imaging is not supported" />
<Check Text="%XHWModel% is Supported" CheckCondition='
InStr(1,"%XHWModel%","3650",1) > 0 Or
InStr(1,"%XHWModel%","5510",1) > 0 Or
InStr(1,"%XHWModel%","7920",1) > 0 Or
InStr(1,"%XHWModel%","M6800",1) > 0' ErrorDescription="Current Image does not support this model, reach out to the IT Team" />
</Action>
</ActionGroup>
<!-- Choice Variables declarations -->
<Action Type="TSVar" Variable="LangList">"Czech,Chinese Simplified,Dutch,English UK,English US,French,French Canadian,German,Italian,Japanese,Korean,Spanish,Spanish Mexican,Swedish"</Action>
<Action Type="TSVar" Variable="LangCodes">"cs-CZ,zh-CN,nl-NL,en-GB,en-US,fr-FR,fr-CA,de-DE,it-IT,ja-JP,ko-KR,es-ES,es-MX,sv-SE"</Action>
<Action Type="TSVar" Variable="SiteList">"LON - London,NYC - New York,PAR - Paris,TKY - Tokyo"</Action>
<Action Type="TSVar" Variable="SiteCodes">"LON,NYC,PAR,TKY"</Action>
<Action Type="TSVar" Variable="KeybList">"Belgian,Chinese Simplified,Dutch,English India,English Singapore,English UK,English US,French,French Canadian,German,German Swiss,Hungarian,Italian,Japanese,Korean,Portuguese Brazilian,Spanish,Spanish Mexican,Swedish"</Action>
<Action Type="TSVar" Variable="KeybCodes">"nl-BE,zh-CN,nl-NL,en-IN,en-SG,en-GB,en-US,fr-FR,fr-CA,de-DE,de-CH,hu-HU,it-IT,ja-JP,ko-KR,pt-BR,es-ES,es-MX,sv-SE"</Action>
<!-- Site Selection Screen with site pre-loaded from IP ADDRESS above -->
<Action Type="Input" Name="SiteSelectionScreen" Title="Input selection" Timeout="30">
<InputChoice Variable="SelectedTS" Question="Select Image:" Required="True">
<ChoiceList OptionList="%TS_List%" AlternateValueList="%TS_Codes%" />
</InputChoice>
<InputChoice Variable="SelectedSite" AlternateVariable="OSDSite" Question="Select the site:" Required="True">
<ChoiceList OptionList="%SiteList%" AlternateValueList="%SiteCodes%" />
</InputChoice>
<InputCheckbox Variable="ChangeDefaults" Question="Change default localization settings" CheckedValue="True" UncheckedValue="False" />
<!-- <InputCheckbox Variable="kiosk" Question="This computer will be a Kiosk" CheckedValue="True" UncheckedValue="False" /> -->
<InputCheckbox Variable="isKiosk" Question="This computer will be a Kiosk device" CheckedValue="True" UncheckedValue="False" />
</Action>
<Action Type="Switch" OnValue='%SelectedTS%' DontEval="False">
<Case RegEx="^PROD Win10">
<Variable Name="SMSTSPreferredAdvertID">"SCD0001"</Variable>
</Case>
<Case RegEx="^PROD Win11">
<Variable Name="SMSTSPreferredAdvertID">"SCD0002"</Variable>
</Case>
<Case RegEx="^TEST Win11">
<Variable Name="SMSTSPreferredAdvertID">"SCD0003"</Variable>
</Case>
</Action>
<!--*******************************************************************************-->
<!-- Setting KEYBOARD / LOCALE / TIMEZONE defaults for sites with REGEX matching -->
<!--*******************************************************************************-->
<Action Type="Switch" OnValue='%OSDSite%' DontEval="False">
<!-- London -->
<Case RegEx="SPO">
<Variable Name="UILanguage">"English UK"</Variable>
<Variable Name="KeyboardLayout">"English UK"</Variable>
<Variable Name="OSDDomainName">"europe.mycompany.bla"</Variable>
<Variable Name="OSDDomainOUName">"OU=London,OU=Clients,OU=Computer,DC=europe,DC=mycompany,DC=bla"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUILanguage">"en-GB"</Variable>
<Variable Name="OSDWindowsSettingsInputLocale">"en-GB"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"en-GB"</Variable>
<Variable Name="OSDTimeZone">"GMT Standard Time"</Variable>
</Case>
<!-- Paris -->
<Case RegEx="ROU">
<Variable Name="UILanguage">"French"</Variable>
<Variable Name="KeyboardLayout">"French"</Variable>
<Variable Name="OSDDomainName">"europe.mycompany.bla"</Variable>
<Variable Name="OSDDomainOUName">"OU=Paris,OU=Clients,OU=Computer,DC=europe,DC=mycompany,DC=bla"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUILanguage">"fr-FR"</Variable>
<Variable Name="OSDWindowsSettingsInputLocale">"fr-FR"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"fr-FR"</Variable>
<Variable Name="OSDTimeZone">"Romance Standard Time"</Variable>
</Case>
<!-- Tokyo -->
<Case RegEx="TKO">
<Variable Name="UILanguage">"Japanese"</Variable>
<Variable Name="KeyboardLayout">"Japanese"</Variable>
<Variable Name="OSDDomainName">"americas.mycompany.bla"</Variable>
<Variable Name="OSDDomainOUName">"OU=Tokyo,OU=Clients,OU=Computer,DC=asiapac,DC=mycompany,DC=bla"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUILanguage">"jp-JP"</Variable>
<Variable Name="OSDWindowsSettingsInputLocale">"jp-JP"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"jp-JP"</Variable>
<Variable Name="OSDTimeZone">"Tokyo Standard Time"</Variable>
</Case>
<!-- New York -->
<Case RegEx="NYC">
<Variable Name="UILanguage">"English US"</Variable>
<Variable Name="KeyboardLayout">"English US"</Variable>
<Variable Name="OSDDomainName">"americas.mycompany.bla"</Variable>
<Variable Name="OSDDomainOUName">"OU=NewYork,OU=Clients,OU=Computer,DC=americas,DC=mycompany,DC=bla"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUILanguage">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsInputLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"en-US"</Variable>
<Variable Name="OSDTimeZone">"Central Standard Time"</Variable>
</Case>
</Action>
<!-- **************** CHANGE DEFAULT LOCALIZATION SETTINGS ****************** -->
<ActionGroup Name="Customization" Condition='"%ChangeDefaults%" = "True"'>
<!-- CHANGE DEFAULT LANGUAGE -->
<Action Type="Input" Name="myInput" Title="Please answer the following" ShowBack="True">
<InputChoice Variable="UILanguage" AlternateVariable="OSDWindowsSettingsUILanguage" Question="Windows Language:" Required="True">
<ChoiceList OptionList="%LangList%" AlternateValueList="%LangCodes%" />
</InputChoice>
<!-- CHANGE DEFAULT KEYBOARD - this changes the locale for that input too -->
<InputChoice Variable="KeyboardLayout" Question="Keyboard Layout:" Required="True">
<ChoiceList OptionList="%KeybList%" AlternateValueList="%KeybCodes%" />
</InputChoice>
</Action>
<Action Type="Info" Name="Customsettings" Title="Changes made:" ShowCancel="True" ShowBack="True" >
<![CDATA[Values based on previous selections: <br><hr>
<b>Windows Language:</b> %UILanguage%<br>
<b>Keyboard Ladyout:</b> %KeyboardLayout%<br>
]]>
</Action>
<Action Type="Switch" OnValue='%KeyboardLayout%' DontEval="True">
<Case RegEx="Belgian">
<Variable Name="OSDWindowsSettingsInputLocale">"nl-BE"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"nl-BE"</Variable>
</Case>
<Case RegEx="Chinese Simplified">
<Variable Name="OSDWindowsSettingsInputLocale">"zh-CN"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"zh-CN"</Variable>
</Case>
<Case RegEx="Dutch">
<Variable Name="OSDWindowsSettingsInputLocale">"nl-NL"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"nl-NL"</Variable>
</Case>
<Case RegEx="English India">
<Variable Name="OSDWindowsSettingsInputLocale">"en-IN"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"en-IN"</Variable>
</Case>
<Case RegEx="English Singapore">
<Variable Name="OSDWindowsSettingsInputLocale">"en-SG"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"en-SG"</Variable>
</Case>
<Case RegEx="English UK">
<Variable Name="OSDWindowsSettingsInputLocale">"en-GB"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"en-GB"</Variable>
</Case>
<Case RegEx="English US">
<Variable Name="OSDWindowsSettingsInputLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"en-US"</Variable>
</Case>
<Case RegEx="French">
<Variable Name="OSDWindowsSettingsInputLocale">"fr-FR"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"fr-FR"</Variable>
</Case>
<Case RegEx="French Canadian">
<Variable Name="OSDWindowsSettingsInputLocale">"fr-CA"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"fr-CA"</Variable>
</Case>
<Case RegEx="German">
<Variable Name="OSDWindowsSettingsInputLocale">"de-DE"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"de-DE"</Variable>
</Case>
<Case RegEx="German Swiss">
<Variable Name="OSDWindowsSettingsInputLocale">"de-CH"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"de-CH"</Variable>
</Case>
<Case RegEx="Hungarian">
<Variable Name="OSDWindowsSettingsInputLocale">"hu-HU"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"hu-HU"</Variable>
</Case>
<Case RegEx="Italian">
<Variable Name="OSDWindowsSettingsInputLocale">"it-IT"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"it-IT"</Variable>
</Case>
<Case RegEx="Japanese">
<Variable Name="OSDWindowsSettingsInputLocale">"ja-JP"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"ja-JP"</Variable>
</Case>
<Case RegEx="Korean">
<Variable Name="OSDWindowsSettingsInputLocale">"ko-KR"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"ko-KR"</Variable>
</Case>
<Case RegEx="Portuguese Brazilian">
<Variable Name="OSDWindowsSettingsInputLocale">"pt-BR"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"pt-BR"</Variable>
</Case>
<Case RegEx="Spanish">
<Variable Name="OSDWindowsSettingsInputLocale">"es-ES"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"es-ES"</Variable>
</Case>
<Case RegEx="Spanish Mexican">
<Variable Name="OSDWindowsSettingsInputLocale">"es-MX"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"es-MX"</Variable>
</Case>
<Case RegEx="Swedish">
<Variable Name="OSDWindowsSettingsInputLocale">"sv-SE"</Variable>
<Variable Name="OSDWindowsSettingsSystemLocale">"en-US"</Variable>
<Variable Name="OSDWindowsSettingsUserLocale">"sv-SE"</Variable>
</Case>
</Action>
</ActionGroup>
<!-- Set Additional variables -->
<Action Type="TSVar" Name="OSDComputerName">"%OSDSite%" & "X" & "%XHWSerialNumber%"</Action>
<Action Type="TSVar" Name="OSDLocalAdminPassword">Left("%XHWSerialNumber%",4) & "I@m4hack3r" & Right("%XHWSerialNumber%",3)</Action>
<Action Type="TSVar" Name="OSDWindowsSettingsUILanguageFallback">"en-US"</Action>
<!-- SUMMARY WINDOW -->
<Action Type="Info" Name="Summary" Title="Summary" ShowBack="False" >
<![CDATA[Values based on previous selections: <br><hr>
<b>Computer Name:</b> %OSDComputerName%<br>
<b>Domain Name:</b> %OSDDomainName%<br>
<b>Windows Language:</b> %UILanguage%<br>
<b>Keyboard Layout:</b> %KeyboardLayout%<br>
<b>IP Address:</b> %XIPAddress%<br>
]]>
</Action>
</ActionGroup>
</Actions>
</UIpp>