using System.Management; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Runtime.InteropServices; namespace DeviceAgent.Services; public class DeviceInfoService { private readonly ILogger _logger; public DeviceInfoService(ILogger logger) { _logger = logger; } public DeviceInfo GetDeviceInfo() { var info = new DeviceInfo { CollectedAt = DateTime.UtcNow }; try { // 获取系统 UUID info.Uuid = GetSystemUuid(); // 获取主机名 info.Hostname = Environment.MachineName; // 获取操作系统信息 info.OsName = RuntimeInformation.OSDescription; info.OsVersion = Environment.OSVersion.VersionString; info.OsArchitecture = RuntimeInformation.OSArchitecture.ToString(); // 获取网络信息 var networkInfo = GetNetworkInfo(); info.IpAddress = networkInfo.IpAddress; info.MacAddress = networkInfo.MacAddress; info.SubnetMask = networkInfo.SubnetMask; info.Gateway = networkInfo.Gateway; // 获取硬件信息 info.CpuName = GetCpuName(); info.TotalMemoryMB = GetTotalMemoryMB(); info.Manufacturer = GetManufacturer(); info.Model = GetModel(); info.SerialNumber = GetSerialNumber(); // 获取磁盘信息 info.Disks = GetDiskInfo(); // 获取当前登录用户 info.CurrentUser = Environment.UserName; info.UserDomain = Environment.UserDomainName; // 系统启动时间 info.BootTime = GetBootTime(); } catch (Exception ex) { _logger.LogError(ex, "获取设备信息失败"); } return info; } private string GetSystemUuid() { try { using var searcher = new ManagementObjectSearcher("SELECT UUID FROM Win32_ComputerSystemProduct"); foreach (var obj in searcher.Get()) { return obj["UUID"]?.ToString() ?? ""; } } catch (Exception ex) { _logger.LogWarning(ex, "获取系统UUID失败"); } return ""; } private (string IpAddress, string MacAddress, string SubnetMask, string Gateway) GetNetworkInfo() { string ipAddress = ""; string macAddress = ""; string subnetMask = ""; string gateway = ""; try { var interfaces = NetworkInterface.GetAllNetworkInterfaces() .Where(n => n.OperationalStatus == OperationalStatus.Up && n.NetworkInterfaceType != NetworkInterfaceType.Loopback && n.NetworkInterfaceType != NetworkInterfaceType.Tunnel) .OrderByDescending(n => n.NetworkInterfaceType == NetworkInterfaceType.Ethernet) .ThenByDescending(n => n.Speed) .ToList(); foreach (var ni in interfaces) { var ipProps = ni.GetIPProperties(); var unicast = ipProps.UnicastAddresses .FirstOrDefault(u => u.Address.AddressFamily == AddressFamily.InterNetwork); if (unicast != null) { ipAddress = unicast.Address.ToString(); macAddress = BitConverter.ToString(ni.GetPhysicalAddress().GetAddressBytes()).Replace("-", ":"); subnetMask = unicast.IPv4Mask?.ToString() ?? ""; var gw = ipProps.GatewayAddresses .FirstOrDefault(g => g.Address.AddressFamily == AddressFamily.InterNetwork); gateway = gw?.Address.ToString() ?? ""; break; } } } catch (Exception ex) { _logger.LogWarning(ex, "获取网络信息失败"); } return (ipAddress, macAddress, subnetMask, gateway); } private string GetCpuName() { try { using var searcher = new ManagementObjectSearcher("SELECT Name FROM Win32_Processor"); foreach (var obj in searcher.Get()) { return obj["Name"]?.ToString() ?? ""; } } catch (Exception ex) { _logger.LogWarning(ex, "获取CPU信息失败"); } return ""; } private long GetTotalMemoryMB() { try { using var searcher = new ManagementObjectSearcher("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem"); foreach (var obj in searcher.Get()) { var bytes = Convert.ToInt64(obj["TotalPhysicalMemory"]); return bytes / 1024 / 1024; } } catch (Exception ex) { _logger.LogWarning(ex, "获取内存信息失败"); } return 0; } private string GetManufacturer() { try { using var searcher = new ManagementObjectSearcher("SELECT Manufacturer FROM Win32_ComputerSystem"); foreach (var obj in searcher.Get()) { return obj["Manufacturer"]?.ToString() ?? ""; } } catch (Exception ex) { _logger.LogWarning(ex, "获取制造商信息失败"); } return ""; } private string GetModel() { try { using var searcher = new ManagementObjectSearcher("SELECT Model FROM Win32_ComputerSystem"); foreach (var obj in searcher.Get()) { return obj["Model"]?.ToString() ?? ""; } } catch (Exception ex) { _logger.LogWarning(ex, "获取型号信息失败"); } return ""; } private string GetSerialNumber() { try { using var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BIOS"); foreach (var obj in searcher.Get()) { return obj["SerialNumber"]?.ToString() ?? ""; } } catch (Exception ex) { _logger.LogWarning(ex, "获取序列号失败"); } return ""; } private List GetDiskInfo() { var disks = new List(); try { foreach (var drive in DriveInfo.GetDrives().Where(d => d.IsReady && d.DriveType == DriveType.Fixed)) { disks.Add(new DiskInfo { Name = drive.Name, Label = drive.VolumeLabel, TotalSizeGB = drive.TotalSize / 1024 / 1024 / 1024, FreeSpaceGB = drive.AvailableFreeSpace / 1024 / 1024 / 1024, FileSystem = drive.DriveFormat }); } } catch (Exception ex) { _logger.LogWarning(ex, "获取磁盘信息失败"); } return disks; } private DateTime? GetBootTime() { try { var uptime = TimeSpan.FromMilliseconds(Environment.TickCount64); return DateTime.Now - uptime; } catch { return null; } } } public class DeviceInfo { public string Uuid { get; set; } = ""; public string Hostname { get; set; } = ""; public string IpAddress { get; set; } = ""; public string MacAddress { get; set; } = ""; public string SubnetMask { get; set; } = ""; public string Gateway { get; set; } = ""; public string OsName { get; set; } = ""; public string OsVersion { get; set; } = ""; public string OsArchitecture { get; set; } = ""; public string CpuName { get; set; } = ""; public long TotalMemoryMB { get; set; } public string Manufacturer { get; set; } = ""; public string Model { get; set; } = ""; public string SerialNumber { get; set; } = ""; public List Disks { get; set; } = new(); public string CurrentUser { get; set; } = ""; public string UserDomain { get; set; } = ""; public DateTime? BootTime { get; set; } public DateTime CollectedAt { get; set; } } public class DiskInfo { public string Name { get; set; } = ""; public string Label { get; set; } = ""; public long TotalSizeGB { get; set; } public long FreeSpaceGB { get; set; } public string FileSystem { get; set; } = ""; }