using System.Management; using Microsoft.Extensions.Logging; using PatchProbe.Shared.Contracts; using PatchProbe.Shared.Models; namespace PatchProbe.Cli.Collectors; public sealed class DeviceCollector(ILogger logger) : ICollector { public Task CollectAsync(CancellationToken cancellationToken = default) { logger.LogInformation("Collecting device information"); var cs = QueryFirst("SELECT * FROM Win32_ComputerSystem"); var bios = QueryFirst("SELECT * FROM Win32_BIOS"); var tpm = QueryFirst("SELECT * FROM Win32_Tpm", @"root\CIMv2\Security\MicrosoftTpm"); var info = new DeviceInfo { Hostname = Environment.MachineName, Manufacturer = cs?["Manufacturer"]?.ToString()?.Trim(), Model = cs?["Model"]?.ToString()?.Trim(), SerialNumber = bios?["SerialNumber"]?.ToString()?.Trim(), BiosVersion = bios?["SMBIOSBIOSVersion"]?.ToString()?.Trim(), BiosDate = bios?["ReleaseDate"]?.ToString()?.Trim(), TpmPresent = tpm != null, TpmVersion = tpm?["SpecVersion"]?.ToString()?.Trim(), RamBytes = cs != null ? Convert.ToUInt64(cs["TotalPhysicalMemory"]) : 0, Domain = cs?["Domain"]?.ToString()?.Trim(), Workgroup = string.Equals(cs?["DomainRole"]?.ToString(), "0", StringComparison.Ordinal) || string.Equals(cs?["DomainRole"]?.ToString(), "1", StringComparison.Ordinal) ? cs?["Workgroup"]?.ToString()?.Trim() : null, SystemType = cs?["SystemType"]?.ToString()?.Trim(), }; return Task.FromResult(info); } private static ManagementBaseObject? QueryFirst(string query, string scope = @"root\CIMv2") { try { using var searcher = new ManagementObjectSearcher(new ManagementScope(scope), new ObjectQuery(query)); using var results = searcher.Get(); foreach (ManagementBaseObject obj in results) return obj; } catch { /* best-effort */ } return null; } }