Initial Commit
This commit is contained in:
48
PatchProbe.Cli/Collectors/HotfixCollector.cs
Normal file
48
PatchProbe.Cli/Collectors/HotfixCollector.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using System.Management;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using PatchProbe.Shared.Contracts;
|
||||
using PatchProbe.Shared.Models;
|
||||
|
||||
namespace PatchProbe.Cli.Collectors;
|
||||
|
||||
public sealed class HotfixCollector(ILogger<HotfixCollector> logger) : ICollector<List<InstalledHotfix>>
|
||||
{
|
||||
public Task<List<InstalledHotfix>> CollectAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
logger.LogInformation("Collecting installed hotfixes via Win32_QuickFixEngineering");
|
||||
|
||||
var hotfixes = new List<InstalledHotfix>();
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user