FieldWorkClient/Provider/SystemInfoCollector.cs

189 lines
6.2 KiB
C#

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<DiskInfo> 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<ManagementObject>().First()["Name"].ToString();
}
private static string GetCPUID()
{
using var searcher = new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor");
return searcher.Get().Cast<ManagementObject>().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<ManagementObject>()
.Sum(m => Convert.ToDouble(m["Capacity"])) / (1024 * 1024 * 1024);
return Math.Round(total, 1);
}
private static List<DiskInfo> GetDiskInfo()
{
using var searcher = new ManagementObjectSearcher("SELECT Model,Size FROM Win32_DiskDrive");
return searcher.Get().Cast<ManagementObject>().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<ManagementObject>().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<ManagementObject>().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;
}
}
}