As you probably know, ConfigMgr Current Branch has a built-in task sequence template for Windows 10 Inplace-Upgrades. This template is used for Windows 7/8/8.1 to Windows 10 upgrades, as well as for Windows 10 to Windows 10 upgrades (when a new feature update is available).
However, the default task sequence template for Inplace-upgrades are missing some useful features. This post shows you how to add them.
Note, October 2, 2019: For a bit more than a year, I've been starting to split up this sequence into two sequences. One for pre-flight, pre-cache, and validation. And one for the actual upgrade. For more info on that concept, check this link: https://miketerrill.net/2019/01/01/windows-as-a-service-in-the-enterprise-table-of-contents/
Update, July 13, 2017: Added in better logic for driver packages and uploaded an exported ready-made task sequence.
Download the task sequence: http://github.com/DeploymentResearch/DRFiles/blob/master/Misc/Windows10UpgradeTS.zip
Adding Setup Upgrade Assessment and Driver support
The features I recommend adding to the Inplace-Upgrade task sequence is a setup upgrade assessment action, as well as adding support for injecting drivers.
1. Edit your Inplace-Upgrade task sequence, add an extra Upgrade Operating System action, configured it to continue on error, and rename it to Upgrade Assessment.
The compatibility scan will always spit out a non-zero return code, for example 0xC1900210 which is the no issues found return code. The return code is set in a new read-only task sequence variable, the _SMSTSOSUpgradeActionReturnCode variable, and the reason for having a variable that, is so you can use it further down the line in the task sequence. The important thing is that even though Windows setup spits back a hexadecimal value, ConfigMgr reads it as a decimal value, so you need to do some conversion. For example 0xC1900210 in hex is 3247440400 in decimal.
2. Modify the Upgrade the Operating System group to use a task sequence variable as condition: Add _SMSTSOSUpgradeActionReturnCode, and set the value to 3247440400.
Next up is adding driver support, and in this example I had a Windows 10 driver packages for Dell Latitude E7270 and HP EliteBook 8560w.
3. In the Upgrade the Operating System group, add a new group named Drivers, and then use the Download Package Content action to download the driver packages. Also set a condition to only download the package if you're deploying to that model.
4. Configure each Download Package Content action to save the path as a variable, in my case I used a custom path of %_SMSTSMDataPath%\Drivers. By using this path, ConfigMgr automatically cleans out the drivers folder when deployment is completed. (Thanks @WillKo2513 for the tip).
5. Then also add in condition on each Download Package Content action, to make sure it only downloads the package if you have that hardware model. Simply add a WMI Query filter for the model, for example: SELECT * FROM Win32_ComputerSystem WHERE Model LIKE '%Latitude E7270%'
Note: Since the upgrade task sequences in ConfigMgr are not integrated with MDT by default, you can't just use a task sequence variable like Model equals Latitude E7270. That's why you use a WMI Query in the preceding step.
6. Now, the Upgrade Operating System action does have an option (check box) to install drivers that you added, but don't use it. It will fail if there are no drivers available, and there will be models for when you don't need drivers. Instead you will add instructions in the next stop for the setup to add drivers, but only if there are any drivers needed.
Note: You can also add multiple Upgrade Operating System action with different conditions on them, one when there are drivers available, and one when they are no drivers. But I prefer to have a single one, so skip to the next step.
7. After the last driver package, add a Set Task Sequence Variable action with the following settings:
Name: Instruct setup to install drivers if available
Description: The driver option on the Upgrade Operating System action fails if folder doesn't exist, using this as a workaround
Task Sequence Variable: OSDUpgradeStagedContent
Condition: %_SMSTSMDataPath%\Drivers exists
Note: In this task sequence you're using the undocumented OSDUpgradeStagedContent variable, since that's the variable the Upgrade Operating System action is using by default. Technically you can also use the OSDSetupAdditionalUpgradeOptions variable, and add the /installdrivers %_SMSTSMDataPath%\Drivers value, but the OSDSetupAdditionalUpgradeOptions is primarily intended for the /reflectdrivers option and for language packs. The use of the OSDUpgradeStagedContent varible simply makes it easier to handle different combinations of features that you need to apply, like one machine needing drivers and language pack, another just the language pack, and a third only the drivers.
Written by Johan Arwidmark