using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Management; using System.Text; using System.Threading.Tasks; namespace Hopetry.Provider { public class SystemInfo { public string MachineId { get; set; } public HardwareInfo Hardware { get; set; } public OSInfo OS { get; set; } public NetworkInfo Network { get; set; } public DateTime Timestamp { get; set; } } public class HardwareInfo { public string CPU { get; set; } public string CPUID { get; set; } public string Memory { get; set; } public List Disks { get; set; } } public class DiskInfo { public string Model { get; set; } public string Size { get; set; } } public class OSInfo { public string Version { get; set; } public DateTime InstallDate { get; set; } } public class NetworkInfo { public string IPv4 { get; set; } public string MAC { get; set; } } public static class SystemInfoCollector { public static SystemInfo Collect() { return new SystemInfo { MachineId = GetMACAddress(), Timestamp = DateTime.UtcNow, Hardware = new HardwareInfo { CPU = GetCPUInfo(), CPUID = GetCPUID(), Memory = $"{GetTotalMemory()}GB", Disks = GetDiskInfo() }, OS = new OSInfo { Version = GetOSVersion(), InstallDate = GetOSInstallDate() }, Network = new NetworkInfo { IPv4 = GetIPv4Address(), MAC = GetMACAddress() } }; } private static string GetCPUInfo() { using var searcher = new ManagementObjectSearcher("SELECT Name FROM Win32_Processor"); return searcher.Get().Cast().First()["Name"].ToString(); } private static string GetCPUID() { using var searcher = new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor"); return searcher.Get().Cast().First()["ProcessorId"].ToString(); } private static double GetTotalMemory() { using var searcher = new ManagementObjectSearcher("SELECT Capacity FROM Win32_PhysicalMemory"); var total = searcher.Get() .Cast() .Sum(m => Convert.ToDouble(m["Capacity"])) / (1024 * 1024 * 1024); return Math.Round(total, 1); } private static List GetDiskInfo() { using var searcher = new ManagementObjectSearcher("SELECT Model,Size FROM Win32_DiskDrive"); return searcher.Get().Cast().Select(m => new DiskInfo { Model = m["Model"].ToString().Trim(), Size = $"{Convert.ToDouble(m["Size"]) / (1024 * 1024 * 1024):N1}GB" }).ToList(); } private static string GetOSVersion() { using var searcher = new ManagementObjectSearcher("SELECT Caption,Version FROM Win32_OperatingSystem"); var os = searcher.Get().Cast().First(); return $"{os["Caption"]} {os["Version"]}"; } private static DateTime GetOSInstallDate() { using var searcher = new ManagementObjectSearcher("SELECT InstallDate FROM Win32_OperatingSystem"); var installDate = searcher.Get().Cast().First()["InstallDate"].ToString(); return ManagementDateTimeConverter.ToDateTime(installDate); } private static string GetIPv4Address() { return NetworkInterface.GetAllNetworkInterfaces() .Where(n => n.OperationalStatus == OperationalStatus.Up) .SelectMany(n => n.GetIPProperties().UnicastAddresses) .FirstOrDefault(a => a.Address.AddressFamily == AddressFamily.InterNetwork)?.Address.ToString(); } private static string GetMACAddress() { return NetworkInterface.GetAllNetworkInterfaces() .Where(n => n.OperationalStatus == OperationalStatus.Up) .Select(n => n.GetPhysicalAddress().ToString()) .FirstOrDefault() ?? string.Empty; } } }