A PowerShell-based solution that automates the downloading, extraction, and WIM compression of OEM driver packs from Dell, HP, and Lenovo. A companion script dynamically downloads and applies the correct WIM driver pack during OS Deployment (OSD) based on the detected hardware and deployed operating system.
Managing drivers across a fleet of hardware models is one of the most time-consuming parts of Windows OS deployment. ADDAP solves this by:
- Downloading vendor driver pack catalogs and driver packages from Dell, HP, and Lenovo.
- Extracting the downloaded driver packs.
- Compressing the extracted drivers into WIM format for efficient storage and transfer.
- Dynamically applying the correct WIM driver pack during OSD by matching the target device's hardware identifiers and the operating system being deployed.
All processing is driven by an XML configuration file that defines which manufacturers, models, and operating systems to include.
Invoke-DriverPackageCreator.ps1 is run on a build server or administrative workstation. It:
- Reads the XML settings file (
Content\Settings\Settings.xml) to determine which manufacturers, models, and OS versions to process. - Downloads the vendor driver pack catalogs (
.cab/.xml) from Dell, HP, and Lenovo. - Matches catalog entries to the models and operating systems defined in the XML.
- Downloads the applicable driver packs.
- Extracts driver packs using the bundled 7-Zip tool (
Tools\X64\7z.exe/Tools\X86\7z.exe). - Compresses the extracted drivers into WIM images.
- Generates a metadata XML file (
DriverPackageList.xml) that maps each WIM driver pack to its hardware product IDs and target OS.
Invoke-DriverPackageDownload.ps1 runs during an MDT or MECM task sequence. It:
- Detects the current device's manufacturer, product ID, and other hardware identifiers via WMI (
MS_SystemInformation). - Reads the deployed OS version and release from the offline Windows image registry hive.
- Reads the metadata XML to find the driver pack that matches both the hardware and the deployed OS.
- Supports down-leveling — falling back to an older OS release driver pack when an exact match is not available (can be disabled with
-DisableDownLeveling). - Downloads the matching WIM driver pack to the target volume.
- Applies (expands) the WIM to inject drivers into the deployed OS.
Invoke-ConfigurationGenerator.ps1 automates the creation of the XML settings file. It can:
- Query a SQL database (e.g., the MECM database) to retrieve a list of all hardware models in the environment.
- Generate the full XML settings file with the correct manufacturer entries and model lists pre-populated.
ADDAP/
├── Invoke-DriverPackageCreator.ps1 # Downloads, extracts, and WIM-compresses driver packs
├── Invoke-DriverPackageDownload.ps1 # Runs during OSD to download and apply driver packs
├── Invoke-ConfigurationGenerator.ps1 # Generates the XML settings file (optional)
├── Content/
│ ├── Settings/
│ │ └── Template.xml # XML settings template (manufacturers, models, OS list)
│ ├── DBQueries/
│ │ └── GetProductIDList.sql # SQL query to retrieve model list from MECM database
│ └── ScheduledTasks/
│ └── Template.xml # Scheduled task template for automation
├── Functions/ # Helper PowerShell functions (dot-sourced at runtime)
│ ├── Convert-FileSize.ps1
│ ├── Copy-ItemWithProgress.ps1
│ ├── Get-WindowsReleaseHistory.ps1
│ ├── Invoke-FileDownload.ps1
│ ├── Invoke-FileDownloadWithProgress.ps1
│ ├── Invoke-RegistryHiveAction.ps1
│ ├── Invoke-SQLDBQuery.ps1
│ ├── Invoke-ScheduledTaskAction.ps1
│ ├── Start-ProcessWithOutput.ps1
│ └── Libraries/ # .NET assemblies (AlphaFS, HtmlAgilityPack, etc.)
├── Templates/
│ └── TaskSequences/
│ └── MDT/
│ └── ts.xml # Sample MDT task sequence template
├── Tools/
│ ├── X64/ # 64-bit 7-Zip binaries
│ └── X86/ # 32-bit 7-Zip binaries
└── SampleLogs/ # Example log output and DISM logs
The settings XML (Content\Settings\Template.xml) controls all processing. Key sections:
| Parameter | Description |
|---|---|
ApplicationDataRootDirectory |
Root working directory for the script |
StagingDirectory |
Temporary staging area for downloads and extraction |
DownloadDirectory |
Where raw driver pack downloads are stored |
DriverPackageDirectory |
Output directory for the final WIM driver packages |
DisableDownload |
Skip downloading (use previously downloaded packs) |
Force |
Force reprocessing even if packages already exist |
ContinueOnError |
Continue processing remaining models on failure |
Defines which Windows versions to target (e.g., Windows 10 x64, Windows 11 x64). Supports regex-based matching and a LatestReleaseOnly option.
Each manufacturer entry includes:
- Name and Eligibility Expression — regex to match the device's
SystemManufacturerWMI property. - Catalog URLs — vendor-specific driver pack catalog download URLs.
- Product ID Property — which WMI property to use for hardware matching (
SystemSKUfor Dell,BaseboardProductfor HP,SystemProductNamefor Lenovo). - Model List — the specific hardware models to process, each identified by
ProductID,BaseboardProduct,SystemSKU, etc.
Run the following PowerShell snippet on the target hardware to generate the XML node, then paste it into the appropriate manufacturer's <ModelList> section:
$PropertyList = New-Object -TypeName 'System.Collections.Generic.List[Object]'
$PropertyList.Add(@{Name = 'Enabled'; Expression = {$True}})
$PropertyList.Add('SystemProductName')
$PropertyList.Add(@{Name = 'ProductID'; Expression = {$_.BaseboardProduct}})
$PropertyList.Add('BaseboardProduct')
$PropertyList.Add('SystemSKU')
$PropertyList.Add('SystemVersion')
$PropertyList.Add('SystemFamily')
$PropertyList.Add('SystemManufacturer')
$MSSystemInformation = Get-CIMInstance -Namespace "root\WMI" -Class "MS_SystemInformation" | Select-Object -Property ($PropertyList)
$XMLAttributes = $MSSystemInformation.PSObject.Properties | ForEach-Object {"$($_.Name)=`"$($_.Value)`""}
$XMLNode = "<Model $($XMLAttributes -Join ' ') />"
Write-Output -InputObject ($XMLNode)
$Null = $XMLNode | Set-Clipboard -Verbose| Vendor | Catalog Source | Product ID Property |
|---|---|---|
| Dell | DriverPackCatalog.cab | SystemSKU |
| HP | HPClientDriverPackCatalog.cab | BaseboardProduct |
| Lenovo | catalogv2.xml | SystemProductName |
- PowerShell 3.0 or later.
- Administrative privileges (the scripts will self-elevate if not already running as admin).
- Network access to vendor catalog and download URLs.
- For OSD usage: an active MDT or MECM task sequence environment.
- For SQL-based configuration generation: access to a MECM SQL database.
# Run from an elevated PowerShell prompt
.\Invoke-DriverPackageCreator.ps1The script will:
- Create
Content\Settings\Settings.xmlfrom the template if it does not already exist. - Download vendor catalogs.
- Download, extract, and WIM-compress driver packs for all enabled models and OS versions.
To add the current machine's model to the XML automatically:
.\Invoke-DriverPackageCreator.ps1 -AdditionalXMLNodes '<Model Enabled="True" SystemProductName="Latitude 5430" ProductID="0B04" ... />'.\Invoke-ConfigurationGenerator.ps1 -QuerySQLDatabase -SQLDatabaseFQDN "sqlserver.domain.com" -SQLDatabaseBName "CM_ABC"Add Invoke-DriverPackageDownload.ps1 as a Run PowerShell Script step in your MDT or MECM task sequence:
.\Invoke-DriverPackageDownload.ps1 -DriverPackageRootDirectory "\\server\share\Out-Of-Box-Driver-Packages" -DriverPackageMetadataPath "\\server\share\Out-Of-Box-Driver-Packages\Metadata\DriverPackageList.xml"Key parameters:
| Parameter | Description |
|---|---|
-DriverPackageRootDirectory |
UNC path to the root of the driver package share |
-DriverPackageMetadataPath |
Path to the metadata XML generated by the creator script |
-DisableDownLeveling |
Require an exact OS release match (no fallback) |
-Stage |
Stage (copy) the driver content locally before applying |
-RandomDelay |
Add a random delay before downloading (load balancing) |
-ContinueOnError |
Do not fail the task sequence on error |
All scripts produce detailed transcript logs:
- Creator script:
%WINDIR%\Logs\Software\Invoke-DriverPackageCreator\ - Download script (full OS):
%WINDIR%\Logs\Software\Invoke-DriverPackageDownload\ - Download script (task sequence): The task sequence log directory (e.g.,
_SMSTSLogPath)
Log history is automatically maintained with a maximum of 3 log files per script.
- Windows PowerShell 3.0+
- Windows 10 / Windows 11 / Windows Server 2016+
- 7-Zip (bundled in
Tools\) - .NET Framework (for bundled libraries: AlphaFS, HtmlAgilityPack, NLog, NFluent, Registry)