FieldWorkClient/Provider/SystemInfoCollector.cs

137 lines
4.6 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;
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 = GetMACAddress(),
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 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();
}
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;
}
}
}