189 lines
6.2 KiB
C#
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;
|
|
}
|
|
|
|
|
|
}
|
|
}
|