csharp-hardware info

获取 cpu id 和硬盘序列号

using System;
using System.Collections.Generic;
using System.Linq;
// NuGet search Management
using System.Management;
using System.Text;

namespace RegLib
{
public static class RegHelper
{
/// <summary>
/// 获取注册码
/// </summary>
/// <param name="password"></param>
/// <param name="data"></param>
/// <returns></returns>
public static string EncodeCode(string password, Dictionary<string, string> data)
{
if (data == null || data.Count == 0)
throw new ArgumentException("data can not be empty");

var sb = new StringBuilder();
foreach (var d in data)
{
sb.Append($"{d.Key}:{d.Value}").Append(',');
}
sb.Remove(sb.Length - 1, 1);
var text = sb.ToString();
var bsdata = Encoding.UTF8.GetBytes(text);
for (var i = 0; i < bsdata.Length; i += 2)
{
bsdata[i] = (byte)(~bsdata[i]);
}
text = Convert.ToBase64String(bsdata);
return AESHelper.AesEncrypt(text, password);
}

/// <summary>
/// 解密注册码
/// </summary>
/// <param name="password"></param>
/// <param name="code"></param>
/// <returns></returns>
public static Dictionary<string, string> DecodeCode(string password, string code)
{
var data = AESHelper.AesDecrypt(code, password);
var bsdata = Convert.FromBase64String(data);
for (var i = 0; i < bsdata.Length; i += 2)
{
bsdata[i] = (byte)(~bsdata[i]);
}
var text = Encoding.UTF8.GetString(bsdata);
var ret = new Dictionary<string, string>();
foreach(var it in text.Split(','))
{
var vs = it.Split(':');
if (vs.Length != 2)
continue;
ret[vs[0]] = vs[1];
}
return ret;
}

/// <summary>
/// 获取机器码
/// </summary>
/// <param name="cpuid"></param>
/// <param name="diskid"></param>
/// <returns></returns>
public static string GetMachineCode(string cpuid, string diskid)
{
var id = cpuid + diskid;
var bs = Encoding.ASCII.GetBytes(id);
for (var i = 0; i < bs.Length; i += 2)
{
bs[i] = (byte)(~bs[i]);
}
return Convert.ToBase64String(bs);
}

private static string GetCpuID()
{
string strCpu = null;
var myCpu = new ManagementClass("win32_Processor");
var myCpuCollection = myCpu.GetInstances();
foreach (var myObject in myCpuCollection)
{
strCpu = myObject.Properties["Processorid"].Value.ToString();
}
return strCpu;
}

private static string GetDiskID()
{
var mc = new ManagementClass("win32_NetworkAdapterConfiguration");
var disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\"");
disk.Get();
return disk.GetPropertyValue("VolumeSerialNumber").ToString();
}

/// <summary>
/// 获取当前电脑的机器码
/// </summary>
/// <returns></returns>
public static string GetCurrentMachineCode()
{
var cpuid = GetCpuID();
if (string.IsNullOrEmpty(cpuid))
return null;

var diskid = GetDiskID();
if (string.IsNullOrEmpty(diskid))
return null;

return GetMachineCode(cpuid, diskid).ToLower();
}
}
}