Files
RevokeMsgPatcher/RevokeMsgPatcher/Utils/Device.cs
2021-08-21 12:08:22 +08:00

160 lines
4.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Net;
using System.Security.Cryptography;
using System.Text;
namespace RevokeMsgPatcher.Utils
{
public class Device
{
private static string macID = null;
private static string osVersion = null;
private static string fingerPrint = null;
#region PROP, get it only once
public static string MacID
{
get
{
if (macID == null)
{
macID = ObtainMacID();
}
return macID;
}
}
public static string OSVersion
{
get
{
if (osVersion == null)
{
var name = (from x in new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem").Get().Cast<ManagementObject>()
select x.GetPropertyValue("Caption")).FirstOrDefault();
osVersion = name != null ? name.ToString() : "Unknown";
}
return osVersion;
}
}
#endregion
/// <summary>
/// Calculate GUID
/// </summary>
/// <returns>GUID</returns>
public static string Value()
{
try
{
if (fingerPrint == null)
{
fingerPrint = GetHash(
"MAC >> " + MacID
);
}
return fingerPrint;
}
catch
{
return Guid.NewGuid().ToString();
}
}
private static string GetHash(string s)
{
MD5 sec = new MD5CryptoServiceProvider();
ASCIIEncoding enc = new ASCIIEncoding();
byte[] bt = enc.GetBytes(s);
return GetHexString(sec.ComputeHash(bt));
}
private static string GetHexString(byte[] bt)
{
string s = string.Empty;
for (int i = 0; i < bt.Length; i++)
{
byte b = bt[i];
int n, n1, n2;
n = (int)b;
n1 = n & 15;
n2 = (n >> 4) & 15;
if (n2 > 9)
s += ((char)(n2 - 10 + (int)'A')).ToString();
else
s += n2.ToString();
if (n1 > 9)
s += ((char)(n1 - 10 + (int)'A')).ToString();
else
s += n1.ToString();
if ((i + 1) != bt.Length && (i + 1) % 2 == 0) s += "-";
}
return s;
}
#region Original Device ID Getting Code
public static string ObtainMacID()
{
return Identifier("Win32_NetworkAdapterConfiguration", "MACAddress", "IPEnabled");
}
private static string Identifier(string wmiClass, string wmiProperty, string wmiMustBeTrue)
{
string result = "";
try
{
ManagementClass mc = new ManagementClass(wmiClass);
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if (mo[wmiMustBeTrue].ToString() == "True")
{
//Only get the first one
if (result == "")
{
result = mo[wmiProperty].ToString();
break;
}
}
}
}
catch
{
}
return result;
}
private static string Identifier(string wmiClass, string wmiProperty)
{
string result = "";
try
{
ManagementClass mc = new ManagementClass(wmiClass);
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
//Only get the first one
if (result == "")
{
result = mo[wmiProperty].ToString();
break;
}
}
}
catch
{
}
return result;
}
#endregion
}
}