using System.Management; using Microsoft.Extensions.Logging; using PatchProbe.Shared.Contracts; using PatchProbe.Shared.Models; namespace PatchProbe.Cli.Collectors; public sealed class HotfixCollector(ILogger logger) : ICollector> { public Task> CollectAsync(CancellationToken cancellationToken = default) { logger.LogInformation("Collecting installed hotfixes via Win32_QuickFixEngineering"); var hotfixes = new List(); try { using var searcher = new ManagementObjectSearcher( new ManagementScope(@"root\CIMv2"), new ObjectQuery("SELECT * FROM Win32_QuickFixEngineering")); using var results = searcher.Get(); foreach (ManagementBaseObject obj in results) { DateTimeOffset? installedOn = null; var dateRaw = obj["InstalledOn"]?.ToString(); if (!string.IsNullOrEmpty(dateRaw) && DateTime.TryParse(dateRaw, out var dt)) installedOn = new DateTimeOffset(dt, TimeSpan.Zero); hotfixes.Add(new InstalledHotfix { HotFixId = obj["HotFixID"]?.ToString()?.Trim(), Description = obj["Description"]?.ToString()?.Trim(), InstalledBy = obj["InstalledBy"]?.ToString()?.Trim(), InstalledOn = installedOn, }); } logger.LogInformation("Collected {Count} installed hotfixes", hotfixes.Count); } catch (Exception ex) { logger.LogWarning(ex, "Hotfix collection failed"); } return Task.FromResult(hotfixes); } }