Dell offers nicely bundled Client CAB Drivers for their line of workstations. They also offer a fairly large line of driver update and installation tools including the sometimes-hard-to-find Dell Server Update Utility (SUU), Dell Repository Manager (and it’s Client variant) which can be really handy lightweight, in-OS driver bundles, and of course Dell Support website.
What about MDT?
Although these are all great tools, we just want the raw INF files right? While Dell Repository Manager does offer an “export to RAW” option, I found it was really just an executable with some monolithic INF files that did not play well when importing MDT’s OOB store. I’m sure one could have chosen to package the whole thing up in application, but why do things differently and have potentially strange error codes?
Dell OpenManager Deployment Kit for WinPE Embedded Drivers
This post focuses on getting Drivers for WinPE — which you’ll need especially if you’re running MDT 2012U1 with ADK8 (i.e. WinPE4+) or MDT 2013. The aforementioned post mostly focuses on getting WinPE drivers from OpenManager Deployment Toolkit from your model’s Dell Support page. I had no problems following those instructions.
Dell OS Driver Pack for Driver Injection
The post mentioned the Dell OS Driver Pack (which can also be grabbed from your Dell model’s Support Page). I’ve found extracting the drivers from this archive to be the most reliable way to get injectable INF drivers for MDT. The package is actually designed to be a drop-in, set it and forget it installer for ConfigMgr. But, hey they’re kissing cousins right?
First, grab the Dell OS Driver Pack for your server model off the Dell support page, e.g. for the R720xd Drivers-for-OS-Deployment_Application_K4R94_WN64_14.08.10_A00.exe
Extract it. Then, extract the
payload\mas021.zip.zip
You’ll then notice a lot of subfolders and a driver.xml
manifest file (as mentioned by the earlier linked post)
At this point, you could rifle through the subfolders with regex/pattern matching or manually search through XML file.
But why do it the hard way when you can do it the slightly more hard way? That’s to say, let’s write a powershell script to get more consistent results (until they change the XML schema).
Script
This script is designed to be run in the same directory as the extracted mas021.zip
[CmdletBinding(DefaultParameterSetName="Default")] param( [parameter(Mandatory=$true,ParameterSetName = "info1")] [switch] $listAllPackages, [parameter(Mandatory=$true,ParameterSetName = "info2")] [switch] $listOsTypes, [parameter(Mandatory=$true,ParameterSetName = "Default")] [string] $osName, [parameter(Mandatory=$true,ParameterSetName = "extractall")] [switch] $extractAll, [parameter(Mandatory=$false)] [string] $extractDirectory=".\" ) # extract: Drivers-for-OS-Deployment_Application_xxxxxxxxxx.exe > mas021 # thanks http://www.deploymentresearch.com/Research/tabid/62/EntryId/126/Finding-WinPE-drivers-for-Dell-Servers.aspx $currentScriptPath = Split-Path ((Get-Variable MyInvocation -Scope 0).Value).MyCommand.Path Push-Location $currentScriptPath if (!(Test-Path .\drivers.xml)) { write-warning "Could not find drivers.xml in this directory $currentScriptPath" exit } $savePath = "" if ($osName) { $savePath = "$extractDirectory\extract_$($osName)-$(Get-Date -f 'yyyyMMdd-HHmmss')" } elseif ($extractAll) { $savePath = "$extractDirectory\extract_ALL-$(Get-Date -f 'yyyyMMdd-HHmmss')" } else { write-warning "Unknown OS." exit } write-host "Loading drivers.xml" -f green [xml]$driverManifest = gc .\drivers.xml $osTypes = @() foreach ($subsystem in $driverManifest.Catalog.sdlr.SubSystem) { write-host "> Subsystem $($subsystem.name)" -f green foreach ($device in $subsystem.Device) { write-host ">> Device $($device.name)" -f green foreach ($release in $device.release) { # write-host ">>> Release $($release.name)" -f green foreach ($package in $release.package) { if ($listAllPackages) { # write-host ">>>> Package $($package.name)" -f green write-host "P: " -f green -n write-host "OS: $($package.os) " -f yellow -n write-host "SRCPATH: $($package.srcpath)" -f cyan } if ($osTypes -notcontains $package.os) { $osTypes += $package.os } if ($extractAll) { $osName = $package.os } if ($osName) { $driverSaveDir = "" if ($package.os -eq $osName) { $driverSubPath = ("$($package.srcpath)" -replace '/','\') if (Test-Path ".\$driverSubPath") { $driverSaveDir = "$savePath\$osName\$($subsystem.name)" md $driverSaveDir -force | out-null write-host "Copying $($pwd.path)\$driverSubPath to $driverSaveDir ..." -f cyan robocopy ".\$driverSubPath" $driverSaveDir /e /w:2 /r:2 | out-null } else { write-warning "Cannot find driver path $($pwd.path)\$driverSubPath" } } } } } } } if ($listOsTypes) { $osTypes }