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 Updated | March 2026 |
| Applies To | Windows 10, Windows 11 |
| Tools Used | Get-CimInstance, Get-PnpDevice, Get-WindowsDriver, pnputil |
| Requires Admin | Yes for most methods |
| Difficulty | Beginner 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.

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"

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
| Method | Best For | Returns | Admin Required |
|---|---|---|---|
| Get-CimInstance Win32_PnPSignedDriver | Driver versions, filtering by name/manufacturer | Active device drivers with version and date | No |
| Get-PnpDevice + Get-PnpDeviceProperty | Device status, finding problem devices | All PnP devices with status and driver version | No |
| Get-WindowsDriver (DISM) | Driver store inventory, OEM driver audit | All installed driver packages incl. unused ones | Yes |
| pnputil /enum-drivers | Complete INF package list, driver store management | All driver packages with INF names and signers | Yes |
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_PnPSignedDriverwithGet-CimInstance -ClassName Win32_PnPSignedDriver - Use
Get-PnpDevice | Where-Object { $_.Status -ne "OK" }to find devices with errors - Use
Get-WindowsDriver -Onlinefor 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
