PowerShellでドライバの更新状況を確認する方法に対する実務上の答えは「Get-CimInstance Win32_PnPSignedDriverで現在のdriver情報を取得し、PnPUtilでdriver store、Windows Update履歴やSetupAPI logで更新経路を補います。DriverDateだけを最終更新日と断定しません。」です。ここでは現在導入済みdriverのversion/dateと、いつどの経路で更新されたかを別のevidenceとして扱う前提を明示し、初回確認、sample実行、本番判定、元へ戻す条件をそれぞれ独立させます。
DeviceIDとfriendly nameで対象を特定する
ドライバー更新状況は、PnPデバイスのInstanceIdと署名済みドライバーのDeviceIDを対応付けて確認します。対象機器の状態、DriverVersion、DriverDate、Signerを記録し、Windows Updateの履歴だけで最新版と断定しません。メーカーの対象OS・機種表と照合し、更新操作は復元手段を準備した別工程にします。
- Get-PnpDeviceで対象deviceのInstanceIdとStatusを確認する
- Win32_PnPSignedDriverでversion、provider、InfNameを取得する
- pnputil /enum-driversでpublished nameを確認する
- Windows Update履歴とsetupapi.dev.logの調査期間を確認する
署名済みdriverのversion・date・INFを読む
- DriverDateをinstall日時とみなす
- Win32_Productのような別inventoryを使う
- 同名deviceのInstanceIdを見ない
- driver store packageを現在使用中と断定する
- PnPUtil削除を調査中に行う
PnP device statusとproblem codeを照合する
署名付きdriver一覧を限定
Get-CimInstance Win32_PnPSignedDriver |
Select-Object DeviceName,DeviceID,DriverProviderName,DriverVersion,DriverDate,InfName,IsSigned |
Sort-Object DeviceName
全件は多いためDeviceClassやDeviceIDで対象を絞ります。
display driverを確認
Get-CimInstance Win32_PnPSignedDriver | Where-Object DeviceClass -eq 'DISPLAY' |
Select-Object DeviceName,DriverProviderName,DriverVersion,DriverDate,InfName
DriverDateはpackage metadataで、実際のinstall時刻そのものとは限りません。
device statusを照合
Get-PnpDevice -PresentOnly | Where-Object Class -eq 'Display' |
Select-Object Status,Class,FriendlyName,InstanceId
Status Errorならproblem codeやevent logを追加調査します。
driver storeを読み取り列挙
pnputil.exe /enum-drivers /class Display
Windows buildによりfilter option対応が異なるためpnputil /?を確認します。削除・追加optionは実行しません。
Windows Update eventを期間検索
Get-WinEvent -FilterHashtable @{LogName='System';ProviderName='Microsoft-Windows-WindowsUpdateClient';StartTime=(Get-Date).AddDays(-14)} -MaxEvents 200 |
Select-Object TimeCreated,Id,Message
driver更新だけを確実に示すとは限らないため、device/INF情報と突合します。
driver storeをpnputilで読み取り列挙する
DriverVersion、DriverDate、install event時刻、file timestampは別の値です。OEMが日付を固定するpackageもあり、日付順だけで新旧を決めません。deviceは同名でもInstanceIdが違い、driver storeに未使用packageが残ることもあります。現在利用中のINFとversionをdevice instanceへ結びます。
Windows Update eventを期間限定で確認する
確認commandは読み取りです。PnPUtilのadd/delete/installやDevice Managerのrollbackは接続断、表示消失、再起動を招くため別手順にします。更新前にmodel、hardware ID、current INF/version、vendor package署名、restore手段、BitLocker、maintenanceを確認します。異常時は承認済みrollback driverまたはvendor recoveryを使い、driver storeを未確認で整理しません。
更新・rollback操作をinventoryから分離する
Device ManagerのDriver tab、Win32_PnPSignedDriver、PnPUtilのprovider/version/INFを照合します。更新履歴はWindows Update、SetupAPI log、vendor deployment logを時刻で突合し、再起動後のdevice Statusと業務機能を確認します。
device・driver・eventの三sourceで検収する
Win32_PnPSignedDriverのDeviceID、DriverVersion、DriverDate、InfName、SignerとGet-PnpDeviceのStatusをkeyで対応付けます。Windows Update eventは更新履歴の補助であり、現在読み込まれたdriverが最新かどうかを一つの列だけで断定しません。
display driverをCIMとPnPで対応付ける
$d=Get-CimInstance Win32_PnPSignedDriver | Where-Object DeviceClass -eq 'DISPLAY'
$d | Select-Object DeviceName,DeviceID,DriverVersion,DriverDate,InfName,DriverProviderName,Signer
driver候補の一意性をDeviceIDで決める
- driverを一意化:対象DeviceIDに一件のdriver packageとpresent deviceが対応し、version/date/signer/statusを取得できる
- 候補複数・未検出:更新event 0件は未更新の証明にせず、調査期間外やvendor updaterを保留にする
- PnP・CIM error:device欠落、ProblemCode、unsigned、CIM/access errorは個別stateとして報告する
DriverDateだけで新旧比較せず、vendorのdevice hardware ID別releaseを参照します。pnputil /enum-driversはdriver store一覧で、現在使用中との同義ではありません。確認段階で自動updateやdriver削除をしません。
署名なしと非Present deviceを試す
Get-PnpDevice -PresentOnly | Where-Object Class -eq 'Display' | Select-Object Status,Class,FriendlyName,InstanceId,Problem,ProblemDescription
正常、複数GPU、disabled、problem code、driver storeのみ、event 0件をtestします。DeviceID/InstanceId、version、date、INF、signer、PnP status、event IDを同時刻で保存します。
新しい日付だけで更新要否を決めず、DeviceID、INF、provider、version、署名、device statusを一組で比較します。installやrollbackはvendor要件と復旧方法を確認した別作業です。

コメント