Previously I used a batch script for driver management. It works, but requires exact model names. Because PowerShell isn’t available natively in provisioning WinPE, it was not convenient to use directly.

HII.ps1

Using PS2EXE, you can convert a .ps1 to .exe so the PowerShell logic runs in WinPE without PowerShell installed.

PowerShell script (example)

Adapt paths to your production layout. The script expects the driver source root as a parameter (-path).

Param(
    [parameter(Mandatory=$true)][String]$path
)

$Biosvendor = Get-WmiObject Win32_ComputerSystem
$Marque = $Biosvendor.Manufacturer
$Modele = $Biosvendor.Model

if ($Marque -like "*Dell*")       { $Marque = "Dell" }
if ($Marque -like "*Hewlett-Packard*")   { $Marque = "HP" }
if ($Marque -like "*VMware*")       { $Marque = "VM" }
if ($Marque -like "*TOSHIBA*")       { $Marque = "TOSHIBA" }
if ($Marque -like "*Microsoft*")     { $Marque = "Microsoft" }
if ($Marque -like "*Wacom*")       { $Marque = "Wacom" }
if ($Marque -like "*Aava*")       { $Marque = "Aava" }
if ($Marque -like "*WINCOR*")       { $Marque = "WINCOR" }
if ($Marque -like "*LENOVO*")       { $Marque = "LENOVO" }

if ($Marque -eq "LENOVO") {
  $BiosSystem = Get-WmiObject Win32_ComputerSystemproduct
  $Modele = $BiosSystem.Version
}
$Modele = $Modele.replace("HP RT5810","RP5810")
$Modele = $Modele.replace("HPRT5810","RP5810")
$Modele = $Modele.replace("RP581P","RP5810")
$Modele = $Modele.replace("L3D26AV","")
$Modele = $Modele -ireplace [regex]::Escape(","), ""
$Modele = $Modele -ireplace [regex]::Escape("HP "), ""
$Modele = $Modele -ireplace [regex]::Escape("Tower"), ""
$Modele = $Modele -ireplace [regex]::Escape("Workstation"), ""
$Modele = $Modele -ireplace [regex]::Escape("2-in-1"), "2IN1"
$Modele = $Modele -ireplace [regex]::Escape("EliteBook"), ""
$Modele = $Modele -ireplace [regex]::Escape("EliteOne"), ""
$Modele = $Modele -ireplace [regex]::Escape("EliteDesk"), ""
$Modele = $Modele -ireplace [regex]::Escape("Elite"), ""
$Modele = $Modele -ireplace [regex]::Escape("ProBook"), ""
$Modele = $Modele -ireplace [regex]::Escape("ProDesk"), ""
$Modele = $Modele -ireplace [regex]::Escape("Non-Touch AiO"), "AiO"
$Modele = $Modele -ireplace [regex]::Escape("TouchAiO"), "AiO"
$Modele = $Modele -ireplace [regex]::Escape("Non-TouchAiO"), "AiO"
$Modele = $Modele -ireplace [regex]::Escape("TouchAiO"), "AiO"
$Modele = $Modele -ireplace [regex]::Escape("AiO"), "AiO"
$Modele = $Modele -ireplace [regex]::Escape("TWR"), ""
$Modele = $Modele -ireplace [regex]::Escape("23-in"), ""
$Modele = $Modele -ireplace [regex]::Escape("23.8"), ""
$Modele = $Modele -ireplace [regex]::Escape("RPC RETAIL SYSTEM"), "RP"
$Modele = $Modele -ireplace [regex]::Escape("RPS RETAIL SYSTEM"), "RP"
$Modele = $Modele -ireplace [regex]::Escape("Retail System Model"), ""
$Modele = $Modele -ireplace [regex]::Escape("Base Model System"), ""
$Modele = $Modele -ireplace [regex]::Escape("RETAIL SYSTEM"), ""
$Modele = $Modele -ireplace [regex]::Escape("Retail Model"), ""
$Modele = $Modele -ireplace [regex]::Escape("BASE MODEL"), ""
$Modele = $Modele -ireplace [regex]::Escape("RPCRETAIL YSTEM"), "RP"
$Modele = $Modele -ireplace [regex]::Escape("RPSRETAILSYSTEM"), "RP"
$Modele = $Modele -ireplace [regex]::Escape("RetailSystemModel"), ""
$Modele = $Modele -ireplace [regex]::Escape("BaseModelSystem"), ""
$Modele = $Modele -ireplace [regex]::Escape("RETAILSYSTEM"), ""
$Modele = $Modele -ireplace [regex]::Escape("RetailModel"), ""
$Modele = $Modele -ireplace [regex]::Escape("BASEMODEL"), ""
$Modele = $Modele -ireplace [regex]::Escape("NOTEBOOK"), ""
$Modele = $Modele -ireplace [regex]::Escape(" PC"), ""
$Modele = $Modele -ireplace [regex]::Escape("RP5 "), "RP"
$Modele = $Modele -ireplace [regex]::Escape(" POS"), ""
$Modele = $Modele -ireplace [regex]::Escape("MODEL "), ""
$Modele = $Modele -ireplace [regex]::Escape("Business System"), ""
$Modele = $Modele -ireplace [regex]::Escape("Wacom"), ""
$Modele = $Modele -ireplace [regex]::Escape("Mobile "), ""
$Modele = $Modele -ireplace [regex]::Escape("ThinkCentre"), ""
$Modele = $Modele -ireplace [regex]::Escape("ThinkPad"), ""
$Modele = $Modele -ireplace [regex]::Escape("15.6 Inch"), ""

$Modele = $Modele.replace(" ","")

$ModeleFull = $path+"\"+$Marque+"_"+$Modele
#exit 0
write-host "x:\windows\system32\dism.exe /Image:C:\ /Add-Driver /Driver:$ModeleFull /recurse"
Start-Process -FilePath "x:\windows\system32\dism.exe" -ArgumentList "/Image:C:\ /Add-Driver /Driver:$ModeleFull /recurse" -wait -PassThru

Download :

https://github.com/DavidWuibaille/IVANTI/tree/main/Provisionning_Hii

The PowerShell EXE requires the driver source path as an argument (e.g., mapped share or local folder).

PowerShell driver management script

HII.cmd (Custom Legacy solution)

Description

I don’t use Ivanti’s LANDESK HII, but a custom script:

https://github.com/DavidWuibaille/IVANTI/tree/main/Provisionning_Hii

Example layout: unzip to a shared directory (preferred server).

Driver installation script

Update HII.bat to:

  • Add your workstation models
  • Add operating systems if needed
  • Adjust the path(s) used

Provisioning task

Modify your provisioning to use the batch/EXE approach:

  • Map a network drive (preferred server). Use the same drive letter referenced in HII.bat.
Mapping a network drive for provisioning task
  • Run HII.bat
Running HII.bat file
  • Then run C:\drivers\install.bat (uncheck “stop task on error”).

This lets you call a model-specific install.bat. For setup-based drivers, place the installer under C:\drivers\<Model> and call it silently, e.g. C:\drivers\X\setup.exe /s.

Install.bat script for specific drivers

Other solution :TII

An alternative to Ivanti’s HII: TII

This utility comes with the source code and implementation procedure.

TII utility screenshot

Similar Posts