151 lines
5.0 KiB
C#
151 lines
5.0 KiB
C#
|
|
using System.Diagnostics;
|
|||
|
|
using System.Management;
|
|||
|
|
using System.Net;
|
|||
|
|
using System.Net.Http;
|
|||
|
|
using System.Net.NetworkInformation;
|
|||
|
|
using System.Net.Sockets;
|
|||
|
|
using System.Runtime.InteropServices;
|
|||
|
|
|
|||
|
|
namespace YY.Admin.Core.Util
|
|||
|
|
{
|
|||
|
|
public static class DeviceInfoUtil
|
|||
|
|
{
|
|||
|
|
private static readonly ILoggerService _logger = ContainerLocator.Container.Resolve<ILoggerService>();
|
|||
|
|
|
|||
|
|
private static readonly HttpClient _httpClient = ContainerLocator.Container.Resolve<HttpClient>();
|
|||
|
|
|
|||
|
|
public static async Task<string> GetPublicIpAddressAsync()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
using var ipinfoCts = new CancellationTokenSource(TimeSpan.FromSeconds(3));
|
|||
|
|
var response = await _httpClient.GetStringAsync("https://ipinfo.io/ip", ipinfoCts.Token);
|
|||
|
|
return response.Trim();
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
_logger.Error($"获取登录IP地址失败:{ex.Message}");
|
|||
|
|
// 备用方案
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
using var ipifyCts = new CancellationTokenSource(TimeSpan.FromSeconds(3));
|
|||
|
|
var response = await _httpClient.GetStringAsync("https://api.ipify.org", ipifyCts.Token);
|
|||
|
|
return response.Trim();
|
|||
|
|
}
|
|||
|
|
catch (Exception ex2)
|
|||
|
|
{
|
|||
|
|
_logger.Error($"获取登录IP地址失败2:{ex2.Message}");
|
|||
|
|
return "无法获取公网IP";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static IEnumerable<string> GetLocalIpAddresses()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
var host = Dns.GetHostEntry(Dns.GetHostName());
|
|||
|
|
return host.AddressList
|
|||
|
|
.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)
|
|||
|
|
.Select(ip => ip.ToString())
|
|||
|
|
.ToList();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
return new List<string> { "无法获取本地IP" };
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static string GetMachineName()
|
|||
|
|
{
|
|||
|
|
return Environment.MachineName;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static string GetOsVersion()
|
|||
|
|
{
|
|||
|
|
return $"{Environment.OSVersion} ({(Environment.Is64BitOperatingSystem ? "64位" : "32位")})";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static string GetMacAddress()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
var networkInterface = NetworkInterface.GetAllNetworkInterfaces()
|
|||
|
|
.FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up &&
|
|||
|
|
nic.NetworkInterfaceType != NetworkInterfaceType.Loopback);
|
|||
|
|
|
|||
|
|
return networkInterface?.GetPhysicalAddress().ToString() ?? "无法获取MAC地址";
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
return "无法获取MAC地址";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static string GetProcessorInfo()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|||
|
|
{
|
|||
|
|
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor"))
|
|||
|
|
using (var collection = searcher.Get())
|
|||
|
|
{
|
|||
|
|
foreach (var item in collection)
|
|||
|
|
{
|
|||
|
|
return $"{item["Name"]} ({item["NumberOfCores"]}核)";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return Environment.ProcessorCount + " 核处理器";
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
return Environment.ProcessorCount + " 核处理器";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static long GetTotalMemory()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|||
|
|
{
|
|||
|
|
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem"))
|
|||
|
|
using (var collection = searcher.Get())
|
|||
|
|
{
|
|||
|
|
foreach (var item in collection)
|
|||
|
|
{
|
|||
|
|
var totalMemory = Convert.ToInt64(item["TotalPhysicalMemory"]);
|
|||
|
|
return totalMemory / (1024 * 1024); // 转换为MB
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static string GetSystemUpTime()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
using (var uptime = new PerformanceCounter("System", "System Up Time"))
|
|||
|
|
{
|
|||
|
|
uptime.NextValue();
|
|||
|
|
var seconds = (int)uptime.NextValue();
|
|||
|
|
var ts = TimeSpan.FromSeconds(seconds);
|
|||
|
|
return $"{ts.Days}天 {ts.Hours}小时 {ts.Minutes}分钟";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
return "无法获取运行时间";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|