Kit.Core/LibCommon/Kit.Core.Helpers/Service/HardwareInfoService.cs

182 lines
6.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Diagnostics;
using System.Management;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
namespace Kit.Helpers
{
public class OperatingSystemInfo
{
public string OSVersion { get; set; } = string.Empty;
public string BitOperatingSystem { get; set; } = string.Empty;
public string BitProcess { get; set; } = string.Empty;
}
public interface IHardwareInfoProvider
{
string GetProcessorId();
string GetBoardSerial();
string GetMacAddress();
string GetMachineName();
}
internal abstract class HardwareInfoProviderBase : IHardwareInfoProvider
{
public abstract string GetProcessorId();
public abstract string GetBoardSerial();
public string GetMacAddress()
{
try
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces()
.Where(n => n.OperationalStatus == OperationalStatus.Up && n.NetworkInterfaceType != NetworkInterfaceType.Loopback)
.FirstOrDefault();
if (networkInterfaces != null)
{
return networkInterfaces.GetPhysicalAddress().ToString();
}
return "N/A";
}
catch (Exception ex)
{
return $"Error: {ex.Message}";
}
}
public string GetMachineName() => Environment.MachineName;
}
#pragma warning disable CA1416 // Validate platform compatibility
internal class HardwareInfoProviderWindows : HardwareInfoProviderBase, IHardwareInfoProvider
{
private static string _scope = "root\\CIMV2";
private static string GetComponent(string scope, string hwClass, string syntax)
{
ManagementObjectSearcher mos = new ManagementObjectSearcher(scope, "SELECT * FROM " + hwClass);
string result = "";
foreach (ManagementObject mObj in mos.Get())
{
result = Convert.ToString(mObj[syntax]) ?? string.Empty;
}
return result;
}
public override string GetProcessorId() => GetComponent(_scope, "Win32_processor", "ProcessorID");
public override string GetBoardSerial() => GetComponent(_scope, "Win32_BaseBoard", "SerialNumber");
}
internal class HardwareInfoProviderLinux : HardwareInfoProviderBase, IHardwareInfoProvider
{
private string ParseCpuIdOutput(string output)
{
// Пример парсинга вывода cpuid
// Ищем сигнатуру процессора (eax=1)
var lines = output.Split('\n');
foreach (var line in lines)
{
if (line.Contains("0x00000001 0x00:"))
{
// Пример строки: "0x00000001 0x00: eax=0x000306c3 ebx=0x01000800 ecx=0x7ffafbff edx=0xbfebfbff"
var parts = line.Split(' ', StringSplitOptions.RemoveEmptyEntries);
string eax = parts[2].Split('=')[1]; // Например, "0x000306c3"
string ebx = parts[3].Split('=')[1]; // Например, "0x01000800"
string edx = parts[5].Split('=')[1]; // Например, "0xbfebfbff"
// Комбинируем как уникальный идентификатор
//return $"{eax}-{ebx}-{edx}";
return $"{edx.Split('x').ElementAt(1)}{eax.Split('x').ElementAt(1)}".ToUpper();
}
}
return "Не удалось найти данные CPUID";
}
public override string GetProcessorId()
{
try
{
// Настройка процесса для вызова cpuid
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "cpuid",
Arguments = "-r", // Сырой вывод CPUID
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
// Запуск процесса
process.Start();
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
// Парсинг вывода для получения нужной информации
return ParseCpuIdOutput(output);
}
catch (Exception ex)
{
return $"Ошибка при получении Hardware ID: {ex.Message}";
}
}
public override string GetBoardSerial() => string.Empty;
}
internal class HardwareInfoProviderDebug : HardwareInfoProviderBase, IHardwareInfoProvider
{
public override string GetProcessorId() => "FEDCBA9876543210";
public override string GetBoardSerial() => "Debug board serial number";
}
#pragma warning restore CA1416 // Validate platform compatibility
public interface IHardwareInfoService
{
IHardwareInfoProvider Provider { get; }
OperatingSystemInfo GetOperatingSystemInfo();
string GetHardwareId();
}
internal class HardwareInfoService : IHardwareInfoService
{
public OperatingSystemInfo GetOperatingSystemInfo() => new OperatingSystemInfo
{
BitOperatingSystem = Environment.Is64BitProcess ? "x64" : "x32",
BitProcess = Environment.Is64BitOperatingSystem ? "x64" : "x32",
OSVersion = RuntimeInformation.OSDescription
};
public IHardwareInfoProvider Provider { get; private set; }
public HardwareInfoService(IHardwareInfoProvider infoProvider)
{
Provider = infoProvider;
}
public string GetHardwareId()
{
string processorId = Provider.GetProcessorId();
string baseBoardId = Provider.GetBoardSerial();
string macAddress = Provider.GetMacAddress();
string machineName = Provider.GetMachineName();
return CalculateHash($"{processorId}{baseBoardId}{macAddress}{machineName}");
}
private string CalculateHash(string input)
{
using (var algorithm = SHA512.Create())
{
var hashedBytes = algorithm.ComputeHash(Encoding.UTF8.GetBytes(input));
return BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
}
}
}
}