Querying installed driver versions via PowerShell is useful in a wide range of scenarios — pre-upgrade audits, Intune Remediation compliance checks, troubleshooting device issues, or simply documenting the driver state of a machine before a fresh OS install. This updated guide replaces the deprecated Get-WmiObject approach and covers all available modern methods, including Get-CimInstance, Get-PnpDevice, Get-WindowsDriver, and pnputil.

Detail
Last UpdatedMarch 2026
Applies ToWindows 10, Windows 11
Tools UsedGet-CimInstance, Get-PnpDevice, Get-WindowsDriver, pnputil
Requires AdminYes for most methods
DifficultyBeginner to Intermediate

Why Not Get-WmiObject Anymore?

Get-WmiObject was deprecated in PowerShell 3.0 and is completely absent in PowerShell 7+. Any script using Get-WmiObject Win32_PnPSignedDriver will fail silently or throw errors on machines running PS7. The modern equivalent is Get-CimInstance -ClassName Win32_PnPSignedDriver — identical output, works across PS 5.1 and PS 7.x.

PowerShell list of all drivers, including names, manufacturers and installed driver versions

Method 1: Get-CimInstance Win32_PnPSignedDriver

The direct modern replacement for the original command. Returns all signed PnP drivers with device name, version, manufacturer, and driver date:

# All signed PnP drivers — sorted by driver date, most recent first
Get-CimInstance -ClassName Win32_PnPSignedDriver |
    Where-Object { $_.DeviceName -ne $null } |
    Sort-Object DriverDate -Descending |
    Select-Object DeviceName, DriverVersion, Manufacturer, DriverDate |
    Format-Table -AutoSize

Filter by a specific manufacturer or device type:

# Filter by manufacturer — e.g. Intel, NVIDIA, AMD, Realtek
Get-CimInstance -ClassName Win32_PnPSignedDriver |
    Where-Object { $_.Manufacturer -like "*Intel*" } |
    Select-Object DeviceName, DriverVersion, Manufacturer, DriverDate |
    Sort-Object DeviceName |
    Format-Table -AutoSize

# Filter by device name keyword
Get-CimInstance -ClassName Win32_PnPSignedDriver |
    Where-Object { $_.DeviceName -like "*Display*" -or $_.DeviceName -like "*GPU*" } |
    Select-Object DeviceName, DriverVersion, Manufacturer, DriverDate |
    Format-Table -AutoSize

Export to CSV for documentation or comparison after an OS reinstall:

Get-CimInstance -ClassName Win32_PnPSignedDriver |
    Where-Object { $_.DeviceName -ne $null } |
    Sort-Object DeviceName |
    Select-Object DeviceName, DriverVersion, Manufacturer, DriverDate |
    Export-Csv -Path "C:\Temp\drivers_$env:COMPUTERNAME.csv" -NoTypeInformation
Write-Host "Exported to C:\Temp\drivers_$env:COMPUTERNAME.csv"

Method 2: Get-PnpDevice — Device Status and Driver Info

Get-PnpDevice gives you the device manager view — including device status (OK, Error, Unknown) alongside driver details. Useful for identifying problem devices at a glance:

# List all present devices with their status
Get-PnpDevice -PresentOnly |
    Sort-Object Class, FriendlyName |
    Select-Object Status, Class, FriendlyName, InstanceId |
    Format-Table -AutoSize

Find devices with errors — equivalent to the yellow exclamation marks in Device Manager:

# Devices with errors or unknown status
Get-PnpDevice -PresentOnly |
    Where-Object { $_.Status -ne "OK" } |
    Select-Object Status, Class, FriendlyName, InstanceId |
    Format-Table -AutoSize

Get driver version for a specific device using Get-PnpDeviceProperty:

# Get driver version for all present devices via PnP device properties
Get-PnpDevice -PresentOnly | ForEach-Object {
    $device = $_
    $driverVersion = (Get-PnpDeviceProperty -InputObject $device -KeyName "DEVPKEY_Device_DriverVersion" -ErrorAction SilentlyContinue).Data
    $driverDate    = (Get-PnpDeviceProperty -InputObject $device -KeyName "DEVPKEY_Device_DriverDate" -ErrorAction SilentlyContinue).Data

    if ($driverVersion) {
        [PSCustomObject]@{
            FriendlyName  = $device.FriendlyName
            Class         = $device.Class
            DriverVersion = $driverVersion
            DriverDate    = $driverDate
            Status        = $device.Status
        }
    }
} | Sort-Object Class, FriendlyName | Format-Table -AutoSize

Method 3: Get-WindowsDriver (DISM) — Driver Store

Get-WindowsDriver queries the Windows Driver Store directly via DISM — it returns all driver packages including third-party and OEM drivers, even those not currently in use by any active device. This gives a more complete picture than the PnP-based methods:

# All drivers in the Windows Driver Store (requires Admin)
Get-WindowsDriver -Online |
    Sort-Object ProviderName, Driver |
    Select-Object Driver, OriginalFileName, ProviderName, Version, Date, BootCritical |
    Format-Table -AutoSize

Filter to third-party (OEM) drivers only — these are the ones most likely to need manual reinstallation after a clean OS install:

# Third-party OEM drivers only (non-Microsoft)
Get-WindowsDriver -Online |
    Where-Object { $_.ProviderName -notlike "*Microsoft*" } |
    Sort-Object ProviderName |
    Select-Object Driver, OriginalFileName, ProviderName, Version, Date |
    Format-Table -AutoSize

Method 4: pnputil — Complete Driver Package List

pnputil is a built-in command-line tool that manages the driver store. It provides a different view than the WMI/CIM methods — showing driver packages (INF files) rather than individual device driver bindings. Combined with PowerShell, you can parse its output cleanly:

# List all driver packages via pnputil (cleaner output)
pnputil /enum-drivers

# Parse pnputil output into structured PowerShell objects
$rawOutput = pnputil /enum-drivers
$drivers = @()
$current = @{}

foreach ($line in $rawOutput) {
    if ($line -match "^Published Name\s+:\s+(.+)$")       { $current["PublishedName"] = $matches[1].Trim() }
    elseif ($line -match "^Original Name\s+:\s+(.+)$")    { $current["OriginalName"] = $matches[1].Trim() }
    elseif ($line -match "^Provider Name\s+:\s+(.+)$")    { $current["Provider"] = $matches[1].Trim() }
    elseif ($line -match "^Class Name\s+:\s+(.+)$")       { $current["Class"] = $matches[1].Trim() }
    elseif ($line -match "^Driver Version\s+:\s+(.+)$")   { $current["Version"] = $matches[1].Trim() }
    elseif ($line -match "^Signer Name\s+:\s+(.+)$") {
        $current["Signer"] = $matches[1].Trim()
        $drivers += [PSCustomObject]$current
        $current = @{}
    }
}

$drivers | Sort-Object Provider, Class | Format-Table -AutoSize

Practical Use Case: Find a Specific Driver Version

Common helpdesk scenario — quickly check which version of a specific driver is installed (e.g. graphics, network, or audio):

# Quick function — find driver by keyword
function Get-DriverVersion {
    param ([string]$Keyword)

    Get-CimInstance -ClassName Win32_PnPSignedDriver |
        Where-Object {
            $_.DeviceName -like "*$Keyword*" -or
            $_.Manufacturer -like "*$Keyword*"
        } |
        Select-Object DeviceName, DriverVersion, Manufacturer,
            @{N="DriverDate"; E={ $_.DriverDate.ToString("yyyy-MM-dd") }} |
        Sort-Object DeviceName
}

# Examples
Get-DriverVersion -Keyword "NVIDIA"
Get-DriverVersion -Keyword "Realtek"
Get-DriverVersion -Keyword "Intel"
Get-DriverVersion -Keyword "Bluetooth"
Device Manager view

Practical Use Case: Fleet Driver Audit via Intune Remediation

Use a detection-only Intune Remediation to collect driver versions across your fleet and surface them in the reporting dashboard. This example checks whether the Intel network adapter driver meets a minimum version requirement:

# Detection script: Check Intel NIC driver meets minimum version
$minimumVersion = [version]"12.19.0.16"

$nicDriver = Get-CimInstance -ClassName Win32_PnPSignedDriver |
    Where-Object {
        $_.DeviceName -like "*Intel*" -and
        $_.DeviceName -like "*Ethernet*" -or
        $_.DeviceName -like "*Network*"
    } | Select-Object -First 1

if (-not $nicDriver) {
    Write-Host "Intel NIC driver not found"
    exit 0  # Not applicable — skip
}

$installedVersion = [version]$nicDriver.DriverVersion

if ($installedVersion -ge $minimumVersion) {
    Write-Host "Compliant: Intel NIC driver v$installedVersion >= v$minimumVersion"
    exit 0
} else {
    Write-Host "Non-compliant: Intel NIC driver v$installedVersion < v$minimumVersion"
    exit 1
}

Compare Driver State Before and After OS Reinstall

Export driver state before a clean install, then compare with the post-install state to identify any missing drivers:

# Step 1 — before reinstall: export to CSV
Get-CimInstance -ClassName Win32_PnPSignedDriver |
    Where-Object { $_.DeviceName -ne $null } |
    Select-Object DeviceName, DriverVersion, Manufacturer |
    Export-Csv "C:\Temp\drivers_before.csv" -NoTypeInformation

# Step 2 — after reinstall: export again
Get-CimInstance -ClassName Win32_PnPSignedDriver |
    Where-Object { $_.DeviceName -ne $null } |
    Select-Object DeviceName, DriverVersion, Manufacturer |
    Export-Csv "C:\Temp\drivers_after.csv" -NoTypeInformation

# Step 3 — compare: find drivers present before but missing after
$before = Import-Csv "C:\Temp\drivers_before.csv"
$after  = Import-Csv "C:\Temp\drivers_after.csv"

$missing = $before | Where-Object {
    $_.DeviceName -notin $after.DeviceName
}

if ($missing) {
    Write-Host "Missing drivers after reinstall:"
    $missing | Format-Table -AutoSize
} else {
    Write-Host "No missing drivers detected."
}

Method Comparison

MethodBest ForReturnsAdmin Required
Get-CimInstance Win32_PnPSignedDriverDriver versions, filtering by name/manufacturerActive device drivers with version and dateNo
Get-PnpDevice + Get-PnpDevicePropertyDevice status, finding problem devicesAll PnP devices with status and driver versionNo
Get-WindowsDriver (DISM)Driver store inventory, OEM driver auditAll installed driver packages incl. unused onesYes
pnputil /enum-driversComplete INF package list, driver store managementAll driver packages with INF names and signersYes

Summary

Querying installed driver versions in PowerShell is more capable in 2026 than the single Get-WmiObject command from the original article. Use the method that fits your scenario — Get-CimInstance for quick version queries, Get-PnpDevice for device health checks, Get-WindowsDriver for a full driver store inventory, and pnputil for INF package management.

  • Replace all Get-WmiObject Win32_PnPSignedDriver with Get-CimInstance -ClassName Win32_PnPSignedDriver
  • Use Get-PnpDevice | Where-Object { $_.Status -ne "OK" } to find devices with errors
  • Use Get-WindowsDriver -Online for a full driver store inventory including unused packages
  • Export to CSV before clean installs to compare driver state after reinstallation
  • Use Intune Remediation detection scripts to enforce minimum driver versions across your fleet