• C# 读取机器码,CPU序列号,生成注册码类(优化)


    有些CPU不支持获取序列号。

    获取strCpu = myObject.Properties["Processorid"].Value.ToString();时,请判断下返回是否为null,为null的话就说明cpu不支持。
    获取集合对象属性,除非100%确定,否则不要直接访问属性。一旦返回空,就会报空引用错误

    代码
     using System.Management;//需要在项目中添加System.Management引用

    namespace ECBC_CDKEY
    {
    public class SoftReg
    {
    /// <summary>
    /// 取得设备硬盘的卷标号
    /// </summary>
    /// <returns></returns>
    public string GetDiskVolumeSerialNumber()
    {
    ManagementClass mc
    = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObject disk
    = new ManagementObject("win32_logicaldisk.deviceid=\"c:\"");
    disk.Get();
    return disk.GetPropertyValue("VolumeSerialNumber").ToString();
    }

    /// <summary>
    /// 获得CPU的序列号
    /// </summary>
    /// <returns></returns>
    public string getCpu()
    {
    string strCpu = null;
    ManagementClass myCpu
    = new ManagementClass("win32_Processor");
    ManagementObjectCollection myCpuConnection
    = myCpu.GetInstances();
    foreach (ManagementObject myObject in myCpuConnection)
    {
    strCpu
    = myObject.Properties["Processorid"].Value.ToString();
    break;
    }
    return strCpu;
    }

    /// <summary>
    /// 生成机器码
    /// </summary>
    /// <returns></returns>
    public string getMNum()
    {
    string strNum = getCpu() + GetDiskVolumeSerialNumber();//获得24位Cpu和硬盘序列号
    string strMNum = strNum.Substring(0, 24);//从生成的字符串中取出前24个字符做为机器码
    return strMNum;
    }
    public int[] intCode = new int[127];//存储密钥
    public int[] intNumber = new int[25];//存机器码的Ascii值
    public char[] Charcode = new char[25];//存储机器码字
    public void setIntCode()//给数组赋值小于10的数
    {
    for (int i = 1; i < intCode.Length; i++)
    {
    intCode[i]
    = i % 9;
    }
    }

    /// <summary>
    /// 生成注册码
    /// </summary>
    /// <returns></returns>
    public string getRNum()
    {
    setIntCode();
    //初始化127位数组
    string MNum = this.getMNum();//获取注册码
    for (int i = 1; i < Charcode.Length; i++)//把机器码存入数组中
    {
    Charcode[i]
    = Convert.ToChar(MNum.Substring(i - 1, 1));
    }
    for (int j = 1; j < intNumber.Length; j++)//把字符的ASCII值存入一个整数组中。
    {
    intNumber[j]
    = intCode[Convert.ToInt32(Charcode[j])] + Convert.ToInt32(Charcode[j]);
    }
    string strAsciiName = "";//用于存储注册码
    for (int j = 1; j < intNumber.Length; j++)
    {
    if (intNumber[j] >= 48 && intNumber[j] <= 57)//判断字符ASCII值是否0-9之间
    {
    strAsciiName
    += Convert.ToChar(intNumber[j]).ToString();
    }
    else if (intNumber[j] >= 65 && intNumber[j] <= 90)//判断字符ASCII值是否A-Z之间
    {
    strAsciiName
    += Convert.ToChar(intNumber[j]).ToString();
    }
    else if (intNumber[j] >= 97 && intNumber[j] <= 122)//判断字符ASCII值是否a-z之间
    {
    strAsciiName
    += Convert.ToChar(intNumber[j]).ToString();
    }
    else//判断字符ASCII值不在以上范围内
    {
    if (intNumber[j] > 122)//判断字符ASCII值是否大于z
    {
    strAsciiName
    += Convert.ToChar(intNumber[j] - 10).ToString();
    }
    else
    {
    strAsciiName
    += Convert.ToChar(intNumber[j] - 9).ToString();
    }
    }
    }
    return strAsciiName;//返回注册码
    }
    }
    }
  • 相关阅读:
    CF 1006C Three Parts of the Array【双指针/前缀和/后缀和/二分】
    经验笔记二
    CF 1006B Polycarp's Practice【贪心】
    CF 1003D Coins and Queries【位运算/硬币值都为2的幂/贪心】
    CF 1003C Intense Heat【前缀和/精度/双层暴力枚举】
    CF 1003B Binary String Constructing 【构造/找规律/分类讨论】
    CF 1005C Summarize to the Power of Two 【hash/STL-map】
    CF 1005B Delete from the Left 【模拟数组操作/正难则反】
    CF 1005A Tanya and Stairways 【STL】
    CF 1009A Game Shopping 【双指针/模拟】
  • 原文地址:https://www.cnblogs.com/bingyun84/p/1931104.html
Copyright © 2020-2023  润新知