using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Management;
using System.Security.Cryptography;
using System.Text;
namespace HslCommunication.BasicFramework
{
///
/// 软件授权类
///
public class SoftAuthorize : SoftFileSaveBase
{
#region Constructor
///
/// 实例化一个软件授权类
///
public SoftAuthorize()
{
machine_code = GetInfo();
LogHeaderText = "SoftAuthorize";
}
#endregion
#region Static Members
///
/// 注册码描述文本
///
public static readonly string TextCode = "Code";
#endregion
#region Private Members
private string FinalCode { get; set; } = "";
///
/// 是否正式发行版,是的话就取消授权
///
public bool IsReleaseVersion { get; set; } = false;
///
/// 指示是否加载过文件信息
///
private bool HasLoadByFile { get; set; } = false;
private string machine_code = "";
#endregion
#region Public Members
///
/// 指示系统是否处于试用运行
///
public bool IsSoftTrial { get; set; } = false;
#endregion
#region Public Method
///
/// 获取本机的机器码
///
///
public string GetMachineCodeString()
{
return machine_code;
}
///
/// 获取需要保存的数据内容
///
///
public override string ToSaveString()
{
//JObject json = new JObject
//{
// { TextCode, new JValue(FinalCode) }
//};
//return json.ToString();
return "";
}
///
/// 从字符串加载数据
///
///
public override void LoadByString(string content)
{
JObject json = JObject.Parse(content);
FinalCode = SoftBasic.GetValueFromJsonObject(json, TextCode, FinalCode);
HasLoadByFile = true;
}
///
/// 使用特殊加密算法加密数据
///
public override void SaveToFile()
{
SaveToFile(m => SoftSecurity.MD5Encrypt(m));
}
///
/// 使用特殊解密算法解密数据
///
public override void LoadByFile()
{
LoadByFile(m => SoftSecurity.MD5Decrypt(m));
}
///
/// 检查该注册码是否是正确的注册码
///
///
/// 数据加密的方法,必须用户指定
/// 是否注册成功
public bool CheckAuthorize(string code, Func encrypt)
{
if (code != encrypt(GetMachineCodeString()))
{
return false;
}
else
{
FinalCode = code;
SaveToFile();
return true;
}
}
///
/// 检测授权是否成功
///
/// 数据加密的方法,必须用户指定
/// 是否成功授权
public bool IsAuthorizeSuccess(Func encrypt)
{
if (IsReleaseVersion) return true;
if (encrypt(GetMachineCodeString()) == FinalCode)
{
return true;
}
else
{
FinalCode = "";
SaveToFile();
return false;
}
}
#endregion
#region Static Method
///
/// 获取本计算机唯一的机器码
///
///
public static string GetInfo()
{
string unique = "";
// 获取处理器信息
ManagementClass cimobject = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = cimobject.GetInstances();
foreach (ManagementObject mo in moc)
{
unique += mo.Properties["ProcessorId"].Value.ToString();
}
// 获取硬盘ID
ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
ManagementObjectCollection moc1 = cimobject1.GetInstances();
foreach (ManagementObject mo in moc1)
{
unique += (string)mo.Properties["Model"].Value;
break;
}
// 获取BIOS
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("Select SerialNumber From Win32_BIOS");
ManagementObjectCollection moc2 = searcher.Get();
if (moc2.Count > 0)
{
foreach (ManagementObject share in moc2)
{
unique += share["SerialNumber"].ToString();
}
}
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
return SoftBasic.ByteToHexString(md5.ComputeHash(Encoding.Unicode.GetBytes(unique))).Substring(0, 25);
}
#endregion
}
}