Yesterday i did a demo of a Task Sequence I use to extract drivers from a computer that already have all drivers correctly installed, could be a system that I need to reinstall, or a new machine with fairly new drivers installed. The Task Sequence basically grabs information from the computer, such as Operating System, Architecture and Model or Modelalias, grabs the drivers and copy them to the deployment share. I can then import the drivers to a ConfigMgr package or use them in LiteTouch for deployment.
The script is fairly simple and easy to change to fit in your environment.
The Task Sequence
It contains 3 steps, a gather step to get the inventory of the machine correctly, a set finish action to avoid reboot if your are using finish action in customsettings.ini and the application that grabs the drivers. Since it is a application this task sequence works only when Windows is running, not in WinPE.
The Application
The Script runs as an application, so you need to download the script to a folder and then import it as an application with following settings:
PowerShell.exe -ExecutionPolicy Bypass -File ExportDrivers.ps1
The Extract Drivers Application in Deployment Workbench.
The Script
The PowerShell script is a generic script I use a s “wrapper”, so it does have functions that is not really needed in this scenario, so it is possible to make it shorter if you for any reason want that. The script detects if it has been invoked from a task sequence or not, if it has, it will create a path based on deployment root, Operating System, Architecture and ModelAlias (If you don’t use ModelAlias UserExit, start to do that or change to Model in the script), otherwise it will export the drivers to C:\ExportedDrivers
The active part of the script looks like this:
The active part of the script.
Note that it will delete all drivers that begins with PRN. That is printer drivers and I usually do not want them.
ExportDrivers.ps1
<# Install Wrapper 1.0 Author: Mikael Nystrom http://www.deploymentbunny.com #> Function Invoke-Exe{ [CmdletBinding(SupportsShouldProcess=$true)] param( [parameter(mandatory=$true,position=0)] [ValidateNotNullOrEmpty()] [string] $Executable, [parameter(mandatory=$false,position=1)] [string] $Arguments ) if($Arguments -eq "") { Write-Verbose "Running $ReturnFromEXE = Start-Process -FilePath $Executable -ArgumentList $Arguments -NoNewWindow -Wait -Passthru" $ReturnFromEXE = Start-Process -FilePath $Executable -NoNewWindow -Wait -Passthru }else{ Write-Verbose "Running $ReturnFromEXE = Start-Process -FilePath $Executable -ArgumentList $Arguments -NoNewWindow -Wait -Passthru" $ReturnFromEXE = Start-Process -FilePath $Executable -ArgumentList $Arguments -NoNewWindow -Wait -Passthru } Write-Verbose "Returncode is $($ReturnFromEXE.ExitCode)" Return $ReturnFromEXE.ExitCode } Function Get-OSVersion([ref]$OSv){ $OS = Get-WmiObject -class Win32_OperatingSystem Switch -Regex ($OS.Version) { "6.1" {If($OS.ProductType -eq 1) {$OSv.value = "Windows 7 SP1"} Else {$OSv.value = "Windows Server 2008 R2"} } "6.2" {If($OS.ProductType -eq 1) {$OSv.value = "Windows 8"} Else {$OSv.value = "Windows Server 2012"} } "6.3" {If($OS.ProductType -eq 1) {$OSv.value = "Windows 8.1"} Else {$OSv.value = "Windows Server 2012 R2"} } "10." {If($OS.ProductType -eq 1) {$OSv.value = "Windows 10"} Else {$OSv.value = "Windows Server 2016"} } DEFAULT { "Version not listed" } } } Function Import-SMSTSENV{ try { $tsenv = New-Object -COMObject Microsoft.SMS.TSEnvironment Write-Output "$ScriptName - tsenv is $tsenv " $MDTIntegration = "YES" #$tsenv.GetVariables() | % { Write-Output "$ScriptName - $_ = $($tsenv.Value($_))" } } catch { Write-Output "$ScriptName - Unable to load Microsoft.SMS.TSEnvironment" Write-Output "$ScriptName - Running in standalonemode" $MDTIntegration = "NO" } Finally { if ($MDTIntegration -eq "YES"){ $Logpath = $tsenv.Value("LogPath") $LogFile = $Logpath + "\" + "$ScriptName.log" } Else{ $Logpath = $env:TEMP $LogFile = $Logpath + "\" + "$ScriptName.txt" } } } Function Start-Logging{ start-transcript -path $LogFile -Force } Function Stop-Logging{ Stop-Transcript } # Set Vars $SCRIPTDIR = split-path -parent $MyInvocation.MyCommand.Path $SCRIPTNAME = split-path -leaf $MyInvocation.MyCommand.Path $SOURCEROOT = "$SCRIPTDIR\Source" $LANG = (Get-Culture).Name $OSV = $Null $ARCHITECTURE = $env:PROCESSOR_ARCHITECTURE #Try to Import SMSTSEnv . Import-SMSTSENV #Start Transcript Logging . Start-Logging #Detect current OS Version . Get-OSVersion -osv ([ref]$osv) #Output base info Write-Output "" Write-Output "$ScriptName - ScriptDir: $ScriptDir" Write-Output "$ScriptName - SourceRoot: $SOURCEROOT" Write-Output "$ScriptName - ScriptName: $ScriptName" Write-Output "$ScriptName - OS Name: $OSV" Write-Output "$ScriptName - OS Architecture: $ARCHITECTURE" Write-Output "$ScriptName - Current Culture: $LANG" Write-Output "$ScriptName - Integration with MDT(LTI/ZTI): $MDTIntegration" Write-Output "$ScriptName - Log: $LogFile" if($MDTIntegration -eq "YES"){ $RootFolder = $tsenv.Value("Deployroot") $Arch = $tsenv.Value("Architecture") $Model = $tsenv.Value("ModelAlias") $Path = $RootFolder + "\Drivers\" + $OSV + "\" + $Arch + "\" + $Model } else{ $Path = "C:\ExportedDrivers" } Write-Output "$ScriptName - Driver export path: $Path" #Export Drivers Export-WindowsDriver -Destination $Path -Online -Verbose #Get Printer Drivers Get-ChildItem -Path $Path -Filter PRN* -Directory | Remove-Item -Force -Recurse . Stop-Logging
/mike
Categories: Lite Touch, MDT, OS Deployment, OSD
Could you elaborate on the “a set finish action to avoid reboot if your are using finish action in customsettings.ini”, how is this compiled in the task sequence?
FinishAction=NONE
When the script runs on a test computer I get “The term ‘Export-WindowsDriver’ is not recognised as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
You need to run Windows 8.1 or later
#Export Drivers
Export-WindowsDriver -Destination $Path -Online -Verbose
I think that won’t work in Windows 7 SP1 since it is not a command available for that OS.
That is correct, it works in Windows 8.1 (may update) or later