This blog will cover the topic on how to deploy drivers using Setupconfig.ini for feature update through SCCM. Deploying Feature update through SCCM is a process equivalent to deploying a patch where feature update will be installed on a system based upon language and OS version check.
- Introduction
- Why we need to get Drivers installed during Feature Update
- What is required for provisioning Drivers
- Deploy Package, Task Sequence and Feature Update
- Install Package and Task Sequence on client
- Initiate Feature Update and monitor the installation
- Analyse setupact.log for injecting of driver and OS Upgrade status
- System ready to restart
- OS Upgrade completes successfully with drivers installed
Introduction
The downside of this approach is, there will be few failures in your environment and system might get crash after restart (while applying the feature update). You might see blue screen error which is BSOD (Blue screen of death). There could be multiple reason, but one of the dominant reason could be old drivers having issues.
Why we need to get Drivers installed during Feature Update
As discussed previously, to prevent BSOD error which might crash your OS while trying to upgrade the OS, we need to have the latest drivers applied along with the Feature Update patch. Deploying a driver package through task sequence and in-place upgrade task sequence is completely different when compared to deploying drivers to feature update.
When drivers are incorporated along with feature update deployment through SCCM, drivers are injected during upgrade process and will handle the scenario where old driver might cause issue as we upgrading the drivers as well.
What is required for provisioning Drivers
There are 2 requirements for provisioning the Drivers:
- SCCM Package with custom SetupConfig.ini and SetupComplete.cmd files
SetupConfig.ini – is the configuration file containing parameters which is then passed to Windows setup.exe. Few of the parameters we can use are: Priority, ShowOOBE, InstallDrivers, DynamicUpdate, Compat etc. For complete list follow Windows setup command-line options
We can customize this file to control OS Upgrade process. If you face any error while deploying SetupConfig.ini, follow Troubleshoot Windows Feature Update issue when SetupConfig.ini in use
SetupComplete.cmd – is custom Windows setup scripts which executes during or after Windows Setup process. We can control post processing steps through this file which will be applying right after OS Upgrade.
2. Prestage of Driver Package (Task Sequence)
We need to create custom Task Sequence with Download Package Content step for each model.
Create SCCM Package with custom SetupConfig.ini and SetupComplete.cmd files
Create SCCM Package with following folder structure:
Folder : WSUS
Folder : FeatureUpdate
File : Provision.ps1
Create Program with following command line:
powershell -executionpolicy bypass -file Provision.ps1
WSUS folder will contain SetupConfig.ini with following content under this file:
[SetupConfig] ShowOOBE=None Priority=Normal InstallDrivers=C:\windows\Temp\FeatureUpdate\Drivers PostOOBE=C:\Windows\temp\FeatureUpdate\Script\SetupComplete.cmd
Parameters explained:
We don’t want to show OOBE after upgrade hence disabling ShowOOBE, keeping Priority as Normal, we can set as Low as well, InstallDrivers pointing to a location where Drivers will be prestaged.
PostOOBE pointing to SetupComplete.cmd, this file will be used to trigger the script / command right after OS Upgrade.
Another folder Script has following folder structure: FeatureUpdate\Script\SetupComplete.cmd:
SetupComplete.cmd contains following command:
Powershell.exe -ExecutionPolicy Bypass -Command "Remove-Item -Path 'C:\Windows\temp\FeatureUpdate' -Recurse -Force"
This will remove all the content from the system once OS Upgrade is completed.
We can utilize SetupComplete.cmd for other activities as well such as applying layout, deleting /adding folders/files, installing applications etc.
Root of the folder is having Provision.ps1 file with following content:
Copy-Item -Path .\FeatureUpdate -Destination C:\Windows\temp -Recurse
Copy-Item -Path .\WSUS -Destination C:\Users\Default\AppData\Local\Microsoft\Windows -Recurse
We are copying 2 folders by this command:
1. FeatureUpdate folder to c:\Windows\temp\FeatureUpdate
2. WSUS folder to C:\Users\Default\AppData\Local\Microsoft\Windows\WSUS
Note: SetupConfig.ini file should be there at specific location ie. C:\Users\Default\AppData\Local\Microsoft\Windows\WSUS\SetupConfig.ini. This folder (WSUS) will be deleted once OS Upgrade is completed successfully.
Prestage of Driver Package (Task Sequence)
Create a custom task sequence and add the step Download Package Content, add the driver package for a specific model, and use custom path as C:\windows\Temp\FeatureUpdate\Drivers. This is the same location we have used in SetupConfig.ini
Not to forget setting WMI query for that specific model. As I am using VM, I have used:
select * from win32_computersystem where Model = "Virtual Machine"
Deploy Package, Task Sequence and Feature Update
Deploy Feature Update scripts package and Task Sequence to a collection.
Also, deploy Feature update to Windows 10 (business editions), version 1909, en-us x64 to the same collection by making it available.
Install Package and Task Sequence on client
Login to the client, we are using Windows 10 1709 version which will be upgrade to 1909. Launch Software Center and initiate install for Feature Update Scripts and Driver Package Prestage.
Once installation is completed, we can verify the folder structure with all required files.
Initiate Feature Update and monitor the installation
Navigate to Software Center > Updates, select Feature update to Windows 10 (business editions), version 1909, en-us x64, and click on Install. Installation will initiate.
You can monitor the status through updatesdeployment.log (c:\windows\ccm\logs) and C:\$WINDOWS.~BT\Sources\Panther\setupact.log.
Wait for a while once installation is showing 100% in updatesdeployment.log and Software Center showing Restart option. Important information to look into updatesdeployment.log is:
Update (Site_84B69E3C-60D9-4A47-9633-DA7640BB4459/SUM_0af47e05-17cb-4756-8610-09ce486df1ba) Progress: Status = ciStateInstalling, PercentComplete = 100, DownloadSize = 3449692, Result = 0x0
Update (Site_84B69E3C-60D9-4A47-9633-DA7640BB4459/SUM_0af47e05-17cb-4756-8610-09ce486df1ba) Progress: Status = ciStatePendingSoftReboot, PercentComplete = 0, DownloadSize = 3449692, Result = 0x0
CTargetedUpdatesManager::AdjustCompletedState - complete install OS upgrade with pending commit
We can see installation is done and ready to restart to apply new OS. At this moment we are still on old OS.
Analyse setupact.log for injecting of driver and OS Upgrade status
Open setupact.log (Location: C:\$WINDOWS.~BT\Sources\Panther)
Providing you most important information what I can see in the logs:
2020-06-12 14:10:29, Info MOUPG SetupHost::Initialize: CmdLine = [/PreDownload /Update /Quiet /progressCLSID ce2e48fb-98c7-40f4-b7dc-019c44834789 /ReportId {EF94D1FB-CCBF-498A-93CB-1034AC95C2E6}.202 "/ClientId" "da12d64f-5f56-4482-804c-b0b7659dddaf" "/CorrelationVector" "1Nk1F48oMUeKNfvm.9.0.2" /ShowOOBE None /Priority Normal /InstallDrivers C:\windows\Temp\FeatureUpdate\Drivers /PostOOBE C:\Windows\temp\FeatureUpdate\Script\SetupComplete.cmd]
Parameter InstallDrivers pointing to desired location what we used in SetupConfig.ini
Parameter PostOOBE pointing to desired SetupComplete.cmd
Copying Drivers folder to C:\$WINDOWS.~BT\Drivers\User
Drivers placed at C:\$WINDOWS.~BT\Drivers\User location will be injected during OS Upgrade process. Hence, we can see drivers are automatically getting copied from our specified location to C:\$WINDOWS.~BT\Drivers\User location.
2020-06-12 14:13:06, Info MOUPG SetupManager: Copying user-provided driver install package files from [C:\windows\Temp\FeatureUpdate\Drivers] -> [C:\$WINDOWS.~BT\Drivers\User]...
Injecting driver into NewOS Upgrade process
As I have used a Driver package containing 2 drivers only, it would be easy for me to demonstrate what is happening behind the scenes. 2 drivers which I have used is tpt100x.inf & tp2p100x.inf.
Setupact.log will show the successful injection of drivers, which can be seen as:
DRVINST: Successfully injected driver package in the new OS:
'C:\$WINDOWS.~BT\NewOS\Windows\System32\DriverStore\Temp\{9833398B-DBE6-4926-9B96-F36353B45A75}\0811fd6a-69cd-47be-9a5d-feea0f35baed\tp2p100x.inf'. - CDriverPackage::InstallEx2
DRVINST: Successfully injected driver package in the new OS: C:\$WINDOWS.~BT\NewOS\Windows\System32\DriverStore\Temp\{9833398B-DBE6-4926-9B96-F36353B45A75}\0811fd6a-69cd-47be-9a5d-feea0f35baed\tbt100x.inf
DISM Driver Manager: PID=916 TID=1076 Successfully proccessed driver package 'C:\$WINDOWS.~BT\NewOS\Windows\System32\DriverStore\Temp\{9833398B-DBE6-4926-9B96-F36353B45A75}\0811fd6a-69cd-47be-9a5d-feea0f35baed\tbt100x.inf'. - CDriverPackage::InstallEx2
Injecting driver process gets copied to drivers repository to be applied during next restart phase
Once the injecting driver process is completed, it doesn’t mean drivers are injecting right now. Injection process means, drivers will be copied to the new OS Driverstore’s filerepository folder ie C:\$WINDOWS.~BT\NewOS\Windows\System32\DriverStore\FileRepository
We can see the all drivers which will be injected during OS Upgrade process, this shows all previous drivers which is part of the OS + new drivers which we are injecting. I can see my 2 drivers copied at this location:
We can see total count is 658 folders (or we can say drivers), which consists of 656 old drivers part of the OS and 2 new folders (drivers) which we are going to inject during this process.
I compared the same with other Feature Update process where I haven’t used any driver package and I can see 656 folders only, hence a good comparison that this system is having additional drivers to apply during upgrade process.
System ready to restart
We can see in Setupact.log showing :
MIG Received request to restart the explorer process from context: SYSTEM
Launch Software Center and click on Restart
OS Upgrade completes successfully with drivers installed
After going through restart process, system will be configured and new OS will be applied along with the drivers.
Once you login page you can login to the system and check setupapi.offline.log (Location: setupapi.offline.log):
idb: Activating driver package 'tbt100x.inf_amd64_e0ed85d16d58f139'.
idb: Activating driver package 'tp2p100x.inf_amd64_070af6fe5cdea36a'.
set: Driver package tbt100x.inf_amd64_e0ed85d16d58f139 (oem0.inf):
set: Driver package tp2p100x.inf_amd64_070af6fe5cdea36a (oem1.inf):
We can see new drivers located at C:\Windows\System32\DriverStore\FileRepository
I hope this would have given you enought insight about what is happening behind the scenes. Let me know if you have any queries.
Excellent post. Thank you!