This is a front end for SCCM OSD task sequences.
- UMN-OSDFrontEnd
- This project uses the SCConfigMgr ConfigMgrWebService which will need to be set up and running in order to properly leverage all the functionality of the front end.
- Download the latest release
- Unzip and create a package in SCCM.
- Create an AppSettings.json file (it can be called what you like) to define the properties you want in your front end. See the section on app settings for more information.
- Get the ServiceUI.exe from an MDT installation directory (C:\Program Files\Microsoft Deployment Toolkit\Templates\Distribution\Tools\x64 or x86) and make sure it's in your package source files. For my own sanity I made seperate x86 and x64 folders for files specific to a bit level.
- Create a new "Run Command Line" step in your task sequence.
- Set the package to be the one you created in the previous step.
- For the command line set it up something along these lines
x64\ServiceUI.exe -process:TSProgressUI.exe UMN-OSDFrontEnd.exe -s AppSettings.json
.
- You may need two different front end steps for each bit level.
- You can change configurations of the app using the json and include them in the package source then have different front ends for different situations. In our task sequence we have one json configuration when the task sequence is run from Windows and a different configuration when run from WinPE as certain functions don't work or are not required when running from WinPE.
If you want to test using the front end all you need to do is create a configuration json file and then use the syntax UMN-OSDFrontEnd.exe -dev -s AppSettings.json
.
Check out the example json which gives a general overview of how the file should be structured.
Update is the logo so you can use your own. Be careful not to select something too big as it may cover other portions of the UI. You need to specify the width and height of your logo as well as where it's located. This is a relative path to the executable.
{
"logoWidth": 175,
"logoHeight": 137,
"logoSource": "Resources/logo.png",
}
Change the web service to point to your instance of the SCConfigMgr ConfigMgrWebService.
{
"webServiceURI": "this is your server hosting the SCConfigMgr Web Service (https://www.scconfigmgr.com/configmgr-webservice/)",
"webServiceKey": "your_guid",
}
To configure the computer name tab add an entry to the tabs array with the tabName of TabComputerName. Set enabled to true and then configure the computer name rules. In the example below I use a less than or equal to 15 characters and greater than or equal to 5 characters. You can also define a starts with or ends with rule. Make sure you set the rule to be enabled if you want to use it.
{
"tabs": [
{
"tabName": "TabComputerName",
"enabled": true,
"ruleLessThan": 15,
"ruleGreaterThan": 5,
"ruleGreaterLessThanEnabled": true,
"ruleStartsWith": "SW",
"ruleStartsWithEnabled": true,
"ruleEndsWith": "EW",
"ruleEndsWithEnabled": false
}
]
}
Once you've enabled the computer bind tab setup your bind locations array. The rootName will only be used as a display name for that node. Then add an OU and every OU under that OU will be scanned an added. Currently, only the base most OUs in that tree will be a valid bind location. Every other node will not be selectable as a bind location.
{
"tabs": [
{
"tabName": "TabComputerBind",
"enabled": "true",
"bindLocations": [
{
"rootName": "TestOU",
"ou": "OU=Test,OU=Computers,DC=domain,DC=example,DC=com"
},
{
"rootName": "TestOU2",
"ou": "OU=Test2,OU=Computers,DC=domain,DC=example,DC=com"
}
]
},
]
}
Just like the other tabs, enable the pre flight tab and then set up the various pre flight checks you need. Currently there are only five "checkers" that are available:
- physicalDiskCount
- Checks the number of physical disks is below the defined limit.
- ethernetConnected
- Checks to ensure that the device is connected to an Ethernet jack.
- networkConnectivityCheck
- Pings a given IP address to ensure it's up and running. Useful for confirming required network resources are available prior to starting an image.
- 64bitOS
- Checks if the OS running the front end is 64 bit.
- offlineFilesDetected
- Goes through the user profiles on the computer to determine if any have offline files enabled.
{
"tabs": [
{
"tabName": "TabPreFlight",
"enabled": true,
"preFlightChecks": [
{
"checkName": "onePhysicalDisk",
"checkType": "physicalDiskCount",
"diskCheckLimit": 1,
"checkDescription": "Recommended: Only one physical disk present:",
"required": false
},
{
"checkName": "ethernetConnected",
"checkType": "ethernetConnected",
"checkDescription": "Required: Connected via Ethernet",
"required": true
},
{
"checkName": "fullDiskBackupLocation",
"checkType": "networkConnectivityCheck",
"checkDescription": "Required: Full disk backup location available:",
"required": true,
"networkAddress": "255.255.255.255"
},
{
"checkName": "runningFrom64bitOS",
"checkType": "64bitOS",
"checkDescription": "Recommended: Running from a 64-bit OS:",
"checkPassState": true,
"required": false
},
{
"checkName": "noOfflineFiles",
"checkType": "offlineFilesDetected",
"checkDescription": "Recommended: No offline files detected:",
"checkPassState": false,
"required": false
}
]
},
]
}
⚠ WARNING This feature has been removed in the most recent release
{
"tabs": [
{
"tabName": "TabBackupOptions",
"enabled": true
},
]
}
This tab is for removing user profiles from the device prior to imaging to help reduce the amount of data backed up in an autmatic backup task sequence.
{
"tabs": [
{
"tabName": "TabUserProfiles",
"enabled": true,
"domainUsersOnly": true,
"userDomainPrefix": "ourdomain.local\\"
},
]
}
This tab is a list of applications generated through the software secions settings which is a seperate entry from the tabs and will be detailed right below this section.
{
"tabs": [
{
"tabName": "TabApplications",
"enabled": true
},
]
}
These are the application administrative categories (this can be set by right clicking on your application or using our UMN-SCCMApplicationCategorization tool) you've set in SCCM with a kinder name to present to consumers of your task sequence. You can also buil a simple two level structure to group your entries into logical sections.
{
" softwareSections": [
{
"softwareSection": "Site License",
"subCategories": [
{
"categoryName": "Cloud Services",
"categorySCCM": "OSD - Cloud Services"
},
{
"categoryName": "General Software",
"categorySCCM": "OSD - General Software"
}
]
},
{
"softwareSection": "Free Software",
"subCategories": [
{
"categoryName": "Development",
"categorySCCM": "OSD - Free Development"
},
{
"categoryName": "Graphics",
"categorySCCM": "OSD - Free Graphics"
}
]
}
]
}
You can now add custom tabs with custom UI elements to the front end. It currently supports text blocks, drop down menus and check boxes. Each UI element is placed into a group box for organization.
In order to set up a custom tab you'll need the basic framing code.
{
"tabName": "Example Custom Tab",
"tabType": "CustomTab",
"enabled": true,
"tabDisplayName": "Computer Setup",
"tabLayout": [
// Layout items
]
}
Text blocks are just simple text added to the front tab to give users info on what options are available to them.
{ // Example static text box
"groupTitle": "some title",
"itemType": "textBlock",
"dynamic": false,
"manualTextBlock": {
"text": "This is just example text"
}
}
{ // Example dynamic text from ts variable
"groupTitle": "some title",
"itemType": "textBlock",
"dynamic": true,
"tsVariableTextBlock": {
"tsVariable": "tsvariablename"
}
}
{ // Example of static checkboxes
"groupTitle": "Manual CheckBox Group",
"itemType": "checkBoxGroup",
"dataType": "string",
"manualCheckBoxOptions": {
"checkBoxes": [
{
"content": "Example checkbox 1",
"isChecked": true,
"tsVariable": "tsvarname"
},
{
"content": "Example checkbox 2",
"isChecked": false,
"tsVariable": "tsvarname"
}
]
}
}
{ // Example of dynamic checkboxes
"groupTitle": "TSVariable Checkboxes",
"itemType": "checkBoxGroup",
"dynamic": true,
"tsVariableCheckBoxOptions": {
"tsVariable": "tsvarname",
"delimiter": ","
}
}
{ // Example of static drop down menu with a default value
"itemType": "dropDownGroup",
"groupTitle": "Manual Drop Down Menu With Default Selection",
"manualDropDownOptions": {
"setTSVariable": "tsvarname",
"items": [ "Option1", "Option2", "Option3" ],
"defaultValue": "Option2",
"defaultValueType": "string"
}
}
{ // Example of dynamic drop down menu with a default value from a variable
"itemType": "dropDownGroup",
"groupTitle": "TSVariable drop down with dynamic default value",
"tsVariableDropDownOptions": {
"setTSVariable": "tsvarname",
"tsVariable": "tsvarname",
"defaultValue": "tsvarname",
"delimiter": ",",
"defaultValueType": "tsvariable"
}
}