61 lines
2.4 KiB
C#
61 lines
2.4 KiB
C#
using System.Management;
|
|
using Microsoft.Extensions.Logging;
|
|
using PatchProbe.Shared.Contracts;
|
|
using PatchProbe.Shared.Models;
|
|
|
|
namespace PatchProbe.Cli.Collectors;
|
|
|
|
public sealed class DriverCollector(ILogger<DriverCollector> logger) : ICollector<List<DriverInfo>>
|
|
{
|
|
public Task<List<DriverInfo>> CollectAsync(CancellationToken cancellationToken = default)
|
|
{
|
|
logger.LogInformation("Collecting driver information via Win32_PnPSignedDriver");
|
|
|
|
var drivers = new List<DriverInfo>();
|
|
|
|
try
|
|
{
|
|
using var searcher = new ManagementObjectSearcher(
|
|
new ManagementScope(@"root\CIMv2"),
|
|
new ObjectQuery("SELECT * FROM Win32_PnPSignedDriver WHERE DeviceName IS NOT NULL"));
|
|
|
|
using var results = searcher.Get();
|
|
foreach (ManagementBaseObject obj in results)
|
|
{
|
|
DateTimeOffset? driverDate = null;
|
|
var dateRaw = obj["DriverDate"]?.ToString();
|
|
if (!string.IsNullOrEmpty(dateRaw))
|
|
{
|
|
try
|
|
{
|
|
// WMI datetime format: yyyymmddHHmmss.ffffff+UTC — convert via UTC to avoid local-offset mismatch
|
|
var dt = ManagementDateTimeConverter.ToDateTime(dateRaw);
|
|
driverDate = new DateTimeOffset(dt.ToUniversalTime(), TimeSpan.Zero);
|
|
}
|
|
catch { /* best-effort */ }
|
|
}
|
|
|
|
drivers.Add(new DriverInfo
|
|
{
|
|
DeviceName = obj["DeviceName"]?.ToString()?.Trim(),
|
|
DriverVersion = obj["DriverVersion"]?.ToString()?.Trim(),
|
|
Manufacturer = obj["Manufacturer"]?.ToString()?.Trim(),
|
|
InfName = obj["InfName"]?.ToString()?.Trim(),
|
|
HardwareId = obj["HardWareID"]?.ToString()?.Trim(),
|
|
DeviceClass = obj["DeviceClass"]?.ToString()?.Trim(),
|
|
DriverDate = driverDate,
|
|
IsSigned = string.Equals(obj["IsSigned"]?.ToString(), "True", StringComparison.OrdinalIgnoreCase),
|
|
});
|
|
}
|
|
|
|
logger.LogInformation("Collected {Count} drivers", drivers.Count);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.LogWarning(ex, "Driver collection failed");
|
|
}
|
|
|
|
return Task.FromResult(drivers);
|
|
}
|
|
}
|