291 lines
8.6 KiB
C#
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; } = "";
|
|
}
|