182 lines
6.6 KiB
C#
182 lines
6.6 KiB
C#
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();
|
||
}
|
||
}
|
||
}
|
||
}
|