Initial Commit
This commit is contained in:
60
PatchProbe.Cli/Collectors/DriverCollector.cs
Normal file
60
PatchProbe.Cli/Collectors/DriverCollector.cs
Normal file
@@ -0,0 +1,60 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user