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