OSDCloud – Treiber hinzufügen

In diesem Beitrag habe ich beschrieben, wie man einen USB Stick erstellt, von dem man Windows neu aufsetzen kann.

OSDCloud benutzt eine von Lenovo veröffentlichte Liste, um die passenden Treiber herunterzuladen. Man kann den Pfad aus der OSDCloud Funktion Get-LenovoDriverPack.ps1 herauslesen.

Leider wird unser Modell von Lenovo auf der von Lenovo veröffentlichten Liste nicht aufgeführt. Ich habe mich dann an den Hauptentwickler von OSDCloud auf X gewandt (leider kann ich mich nicht ganz von X lösen, da der Austausch der Tech-Community im Gegensatz zur Edu-Community immer noch hauptsächlich auf X stattfindet).

Innert kürzester Zeit haben er und diverse andere geantwortet. Einer der Entwickler hat mir sogar angeboten, uns am nächsten Tag über Teams auszutauschen. Echt beeindruckend.

Ich habe dann folgenden Vorschlag umgesetzt:

Ich lade also das Driverpack für SCCM mit allen benötigten Treibern von der Lenovo Seite herunter und kopiere dieses auf den fertigen USB Stick der gemäss dieser Anleitung erstellt wurde in den Ordner OSDCloudUSB>:\OSDCloud\DriverPacks\DISM\Lenovo\82YS.

Nachtrag: Es hat sich gezeigt, dass dies nicht zuverlässig funktioniert. Als Workaround exportieren wir die Treiber über ein Skript oder laden sie von Lenovo herunter und wählen dann nach dem Neuaufsetzen den Treiber manuell vom gleichen Stick. Hier noch das Skript:

# Zielordner
$Base = "D:\DriverExport"
$WifiOut  = Join-Path $Base "WiFi"
$InputOut = Join-Path $Base "Input"
$DepsOut  = Join-Path $Base "Input-Dependencies"

New-Item -ItemType Directory -Force -Path $WifiOut, $InputOut, $DepsOut | Out-Null

# Helper: PnP-InstanceIds -> oemXX.inf
function Get-InfFromInstanceId {
    param([string[]]$InstanceIds)

    if(-not $InstanceIds -or $InstanceIds.Count -eq 0){ return @() }

    $all = Get-CimInstance Win32_PnPSignedDriver |
           Where-Object { $InstanceIds -contains $_.DeviceID } |
           Select-Object -ExpandProperty InfName -Unique

    $all
}

# ------------------------------------------
# 1) WLAN-Geräte ermitteln
# ------------------------------------------
$wifiAdapters = Get-NetAdapter -ErrorAction SilentlyContinue |
    Where-Object { $_.InterfaceDescription -match 'Wireless|Wi-?Fi|802\.11' }

$wifiIds = $wifiAdapters | Select-Object -ExpandProperty PnpDeviceID -Unique
$wifiInfs = Get-InfFromInstanceId -InstanceIds $wifiIds

"WiFi Adapter:"
$wifiAdapters | Format-Table -Auto Name, InterfaceDescription, Status

"WiFi INFs: $($wifiInfs -join ', ')"

foreach($inf in $wifiInfs){
    pnputil /export-driver $inf $WifiOut | Out-Null
}

# ------------------------------------------
# 2) Eingabegeräte: Keyboard + Touchpad (HID/Mouse)
# ------------------------------------------
# Touchpad-Muster ggf. ergänzen
$touchPatterns = 'Touchpad|Precision Touchpad|Synaptics|ELAN|ALPS|ClickPad'

$inputDevices = @()

# Keyboard-Klasse
$inputDevices += Get-PnpDevice -Class Keyboard -ErrorAction SilentlyContinue

# Maus/HID (Touchpad sitzt oft hier)
$inputDevices += Get-PnpDevice -Class Mouse,HIDClass -ErrorAction SilentlyContinue |
                 Where-Object { $_.FriendlyName -match $touchPatterns -or $_.FriendlyName -match 'HID' }

$inputIds = $inputDevices | Select-Object -ExpandProperty InstanceId -Unique
$inputInfs = Get-InfFromInstanceId -InstanceIds $inputIds

"Input devices (Auswahl):"
$inputDevices | Sort-Object Class, FriendlyName | Format-Table -Auto Class, FriendlyName, InstanceId

"Input INFs: $($inputInfs -join ', ')"

foreach($inf in $inputInfs){
    pnputil /export-driver $inf $InputOut | Out-Null
}

# ------------------------------------------
# 3) (Optional, aber oft nötig) Abhängigkeiten fürs Touchpad: I2C/SerialIO/Chipset
# ------------------------------------------
$depPatterns = 'I2C|Serial IO|GPIO|SMBus|Chipset|Intel\(R\).*Serial|AMD.*I2C'

$depDrivers = Get-CimInstance Win32_PnPSignedDriver |
              Where-Object { $_.DeviceName -match $depPatterns -or $_.FriendlyName -match $depPatterns } |
              Select-Object DeviceName, InfName, DriverProviderName -Unique

"Possible dependencies:"
$depDrivers | Sort-Object DriverProviderName, DeviceName | Format-Table -Auto

$depInfs = $depDrivers | Select-Object -ExpandProperty InfName -Unique
foreach($inf in $depInfs){
    pnputil /export-driver $inf $DepsOut | Out-Null
}

"Fertig. Export unter: $Base"

Schade, dass Lenovo unser Modell „vergessen“ hat. Ich habe das Problem Lenovo Schweiz gemeldet und hoffe, dass sie unser Modell noch nachtragen werden.

Hinterlasse einen Kommentar