52 lines
2.1 KiB
C#
52 lines
2.1 KiB
C#
using System.Management;
|
|
using Microsoft.Extensions.Logging;
|
|
using PatchProbe.Shared.Contracts;
|
|
using PatchProbe.Shared.Models;
|
|
|
|
namespace PatchProbe.Cli.Collectors;
|
|
|
|
public sealed class DeviceCollector(ILogger<DeviceCollector> logger) : ICollector<DeviceInfo>
|
|
{
|
|
public Task<DeviceInfo> 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;
|
|
}
|
|
}
|