SoftAuthorize.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. using Newtonsoft.Json.Linq;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Management;
  7. using System.Security.Cryptography;
  8. using System.Text;
  9. namespace HslCommunication.BasicFramework
  10. {
  11. /// <summary>
  12. /// 软件授权类
  13. /// </summary>
  14. public class SoftAuthorize : SoftFileSaveBase
  15. {
  16. #region Constructor
  17. /// <summary>
  18. /// 实例化一个软件授权类
  19. /// </summary>
  20. public SoftAuthorize()
  21. {
  22. machine_code = GetInfo();
  23. LogHeaderText = "SoftAuthorize";
  24. }
  25. #endregion
  26. #region Static Members
  27. /// <summary>
  28. /// 注册码描述文本
  29. /// </summary>
  30. public static readonly string TextCode = "Code";
  31. #endregion
  32. #region Private Members
  33. private string FinalCode { get; set; } = "";
  34. /// <summary>
  35. /// 是否正式发行版,是的话就取消授权
  36. /// </summary>
  37. public bool IsReleaseVersion { get; set; } = false;
  38. /// <summary>
  39. /// 指示是否加载过文件信息
  40. /// </summary>
  41. private bool HasLoadByFile { get; set; } = false;
  42. private string machine_code = "";
  43. #endregion
  44. #region Public Members
  45. /// <summary>
  46. /// 指示系统是否处于试用运行
  47. /// </summary>
  48. public bool IsSoftTrial { get; set; } = false;
  49. #endregion
  50. #region Public Method
  51. /// <summary>
  52. /// 获取本机的机器码
  53. /// </summary>
  54. /// <returns></returns>
  55. public string GetMachineCodeString()
  56. {
  57. return machine_code;
  58. }
  59. /// <summary>
  60. /// 获取需要保存的数据内容
  61. /// </summary>
  62. /// <returns></returns>
  63. public override string ToSaveString()
  64. {
  65. //JObject json = new JObject
  66. //{
  67. // { TextCode, new JValue(FinalCode) }
  68. //};
  69. //return json.ToString();
  70. return "";
  71. }
  72. /// <summary>
  73. /// 从字符串加载数据
  74. /// </summary>
  75. /// <param name="content"></param>
  76. public override void LoadByString(string content)
  77. {
  78. JObject json = JObject.Parse(content);
  79. FinalCode = SoftBasic.GetValueFromJsonObject(json, TextCode, FinalCode);
  80. HasLoadByFile = true;
  81. }
  82. /// <summary>
  83. /// 使用特殊加密算法加密数据
  84. /// </summary>
  85. public override void SaveToFile()
  86. {
  87. SaveToFile(m => SoftSecurity.MD5Encrypt(m));
  88. }
  89. /// <summary>
  90. /// 使用特殊解密算法解密数据
  91. /// </summary>
  92. public override void LoadByFile()
  93. {
  94. LoadByFile(m => SoftSecurity.MD5Decrypt(m));
  95. }
  96. /// <summary>
  97. /// 检查该注册码是否是正确的注册码
  98. /// </summary>
  99. /// <param name="code"></param>
  100. /// <param name="encrypt">数据加密的方法,必须用户指定</param>
  101. /// <returns>是否注册成功</returns>
  102. public bool CheckAuthorize(string code, Func<string, string> encrypt)
  103. {
  104. if (code != encrypt(GetMachineCodeString()))
  105. {
  106. return false;
  107. }
  108. else
  109. {
  110. FinalCode = code;
  111. SaveToFile();
  112. return true;
  113. }
  114. }
  115. /// <summary>
  116. /// 检测授权是否成功
  117. /// </summary>
  118. /// <param name="encrypt">数据加密的方法,必须用户指定</param>
  119. /// <returns>是否成功授权</returns>
  120. public bool IsAuthorizeSuccess(Func<string, string> encrypt)
  121. {
  122. if (IsReleaseVersion) return true;
  123. if (encrypt(GetMachineCodeString()) == FinalCode)
  124. {
  125. return true;
  126. }
  127. else
  128. {
  129. FinalCode = "";
  130. SaveToFile();
  131. return false;
  132. }
  133. }
  134. #endregion
  135. #region Static Method
  136. /// <summary>
  137. /// 获取本计算机唯一的机器码
  138. /// </summary>
  139. /// <returns></returns>
  140. public static string GetInfo()
  141. {
  142. string unique = "";
  143. // 获取处理器信息
  144. ManagementClass cimobject = new ManagementClass("Win32_Processor");
  145. ManagementObjectCollection moc = cimobject.GetInstances();
  146. foreach (ManagementObject mo in moc)
  147. {
  148. unique += mo.Properties["ProcessorId"].Value.ToString();
  149. }
  150. // 获取硬盘ID
  151. ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
  152. ManagementObjectCollection moc1 = cimobject1.GetInstances();
  153. foreach (ManagementObject mo in moc1)
  154. {
  155. unique += (string)mo.Properties["Model"].Value;
  156. break;
  157. }
  158. // 获取BIOS
  159. ManagementObjectSearcher searcher =
  160. new ManagementObjectSearcher("Select SerialNumber From Win32_BIOS");
  161. ManagementObjectCollection moc2 = searcher.Get();
  162. if (moc2.Count > 0)
  163. {
  164. foreach (ManagementObject share in moc2)
  165. {
  166. unique += share["SerialNumber"].ToString();
  167. }
  168. }
  169. MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
  170. return SoftBasic.ByteToHexString(md5.ComputeHash(Encoding.Unicode.GetBytes(unique))).Substring(0, 25);
  171. }
  172. #endregion
  173. }
  174. }