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; using System.Security.Cryptography; 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 = GenerateDeviceId(), 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 GenerateDeviceId() { var components = new[] { GetWmiInfo("Win32_BaseBoard", "SerialNumber"), GetWmiInfo("Win32_Processor", "ProcessorId"), GetWmiInfo("Win32_DiskDrive WHERE Index=0", "SerialNumber") }; var rawId = string.Join("|", components.Where(s => !string.IsNullOrEmpty(s))); using (var sha = SHA256.Create()) { byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(rawId)); return BitConverter.ToString(hash).Replace("-", "").Substring(0, 32); } } private static string GetWmiInfo(string query, string property) { try { var searcher = new ManagementObjectSearcher($"SELECT {property} FROM {query}"); foreach (ManagementObject obj in searcher.Get()) { return obj[property]?.ToString().Trim() ?? string.Empty; } } catch { // 忽略单个组件获取失败 } return string.Empty; } 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(); } static string GetMachineCode() { string machineCode = ""; using (ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard")) { foreach (ManagementObject mo in mos.Get()) { machineCode += mo["SerialNumber"].ToString().Trim(); } } return machineCode; } 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; } } }