serverRoom/device-agent/Services/DeviceInfoService.cs

291 lines
8.6 KiB
C#

using System.Management;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;
namespace DeviceAgent.Services;
public class DeviceInfoService
{
private readonly ILogger<DeviceInfoService> _logger;
public DeviceInfoService(ILogger<DeviceInfoService> 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<DiskInfo> GetDiskInfo()
{
var disks = new List<DiskInfo>();
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<DiskInfo> 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; } = "";
}