C#软件注册和注册

原理就是软件与注册机使用同一种算法,将数据进行匹配。注册后将数据写入至注册表中。一种简单的注册机的方式。

1、软件的实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Text;
using System.Threading.Tasks;

namespace SoftwareRegister
{
    class SoftReg
    {
        /// <summary>
        /// 获取硬盘序列号
        /// </summary>
        /// <returns></returns>
        public string GetDiskSerialNum()
        {
            ManagementClass mydisk = 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 GetCpuSerialNum()
        {
            string cpustr = "";
            ManagementClass mycpu = new ManagementClass("win32_Processor");
            ManagementObjectCollection mycpuCollention = mycpu.GetInstances();
            foreach (ManagementObject var in mycpuCollention)
            {
                cpustr = var.Properties["Processorid"].Value.ToString();
            }
            return cpustr;
        }
        /// <summary>
        /// 通过CPU序列号和硬盘序列号的前24位做机器码
        /// </summary>
        /// <returns></returns>
        public string GetMachineNum()
        {
            string Num = GetCpuSerialNum() + GetDiskSerialNum();
            string MachineNum = Num.Substring(0,24);
            return MachineNum;
        }

        public int[] m_intCode = new int[127];  //存储密钥
        public char[] m_charASCII = new char[25];  //存储ASCII
        public int[] m_intASCII = new int[25]; //存储ASCII的值

        /// <summary>
        /// 初始化密钥(通过模9生成)
        /// </summary>
        public void IntiIntCode()
        {
            for (int i = 0; i < m_intCode.Length; i++)
            {
                m_intCode[i] = i % 9;
            }
        }

        /// <summary>
        /// 获取设备注册码
        /// </summary>
        /// <returns></returns>
        public string GetRegisterNum()
        {
            IntiIntCode();
            string MachineNume = GetMachineNum();
            //通过机器码获取ASCII码
            for (int i = 1; i < m_charASCII.Length; i++)
            {
                m_charASCII[i] = Convert.ToChar(MachineNume.Substring(i - 1, 1));
            }
            //通过简单算法,改变ASCII的值, ASCII的值,再加上初始化密钥的值
            for (int j = 1; j < m_intASCII.Length; j++)
            {
                m_intASCII[j] = Convert.ToInt32(m_charASCII[j]) + m_intCode[Convert.ToInt32(m_charASCII[j])];
            }
            string MachineASCII = "";
            for (int k = 1; k < m_intASCII.Length; k++)
            {
                if ((m_intASCII[k] >= 48 && m_intASCII[k] <= 57) || (m_intASCII[k] >= 65 && m_intASCII[k] <= 90) || (m_intASCII[k] >= 97 && m_intASCII[k] <= 122))
                {
                    MachineASCII += Convert.ToChar(m_intASCII[k]).ToString();  //在0-9,A-Z,a-z之间
                }
                else if (m_intASCII[k] > 122)
                {
                    MachineASCII += Convert.ToChar(m_intASCII[k] - 10).ToString(); //大于z
                }
                else
                {
                    MachineASCII += Convert.ToChar(m_intASCII[k] - 9).ToString();
                }
            }
            return MachineASCII;
        }
    }
}
2、检查注册是否可用

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SoftwareRegister
{
    public class CheckReg
    {
        SoftReg softReg = new SoftReg();

        /// <summary>
        /// 检查是否已经注册
        /// </summary>
        /// <returns></returns>
        public bool GetIsReg()
        {
            bool IsCheck = false;
            RegistryKey regKey = Registry.CurrentUser.OpenSubKey("SOFTWARE", true).CreateSubKey("mySoftWare").CreateSubKey("Register.INI");
            foreach (var item in regKey.GetSubKeyNames())
            {
                if (item == softReg.GetRegisterNum())
                {
                    IsCheck = true;
                }
            }
            return IsCheck;
        }


        /// <summary>
        /// 判断软件是否可用,拥有二十次的试用期,也可以换成天数,再写入注册表信息
        /// </summary>
        /// <returns></returns>
        public bool GetUseInfo(ref int m_intUse)
        {
            m_intUse = 0;
            bool Is_CanUse = false;
            try
            {
                m_intUse = (int)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0);
            }
            catch (Exception)
            {
                Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0, RegistryValueKind.DWord);
            }
            m_intUse = (int)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0);
            if (m_intUse < 5)
            {
                int int_count = m_intUse + 1;
                Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", int_count);
                Is_CanUse = true;
            }
            else
            {
                Is_CanUse = false;
            }
            return Is_CanUse;
        }
    }
}


</pre><p></p><pre>
主窗体::

using Microsoft.Win32;
using SoftwareRegister;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RegisterMachine
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Inti();
        }
 
        SoftReg softReg = new SoftReg();
        CheckReg checkReg = new CheckReg();
        private void Inti()
        {
            txtb_MachineNum.Text=softReg.GetMachineNum();
            if (checkReg.GetIsReg())
                label1.Text = "软件已经注册";
            else
                label1.Text = "软件未注册";

            int count = 0;
            if (checkReg.GetUseInfo(ref count))
            {
                int k = 5 - count;
                MessageBox.Show("未注册!试用次数还剩下" + k .ToString()+ "次!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (txtB_RegNum.Text == softReg.GetRegisterNum())
                {
                    MessageBox.Show("注册成功!重启软件后生效!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    RegistryKey retkey = Registry.CurrentUser.OpenSubKey("Software", true).CreateSubKey("mySoftWare").CreateSubKey("Register.INI").CreateSubKey(txtB_RegNum.Text);
                    retkey.SetValue("UserName", "Rsoft");
                    this.Close();
                }
                else
                {
                    MessageBox.Show("注册码错误!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    txtB_RegNum.SelectAll();
                }
            }
            catch(Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        private void but_Cancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}




二:注册机

里面的方法和上面的一样,通过同一种算法对数据进行匹配。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Register
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public int[] m_intCode = new int[127];  //存储密钥
        public char[] m_charASCII = new char[25];  //存储ASCII
        public int[] m_intASCII = new int[25]; //存储ASCII的值


        /// <summary>
        /// 初始化密钥(通过模9生成)
        /// </summary>
        public void IntiIntCode()
        {
            for (int i = 0; i < m_intCode.Length; i++)
            {
                m_intCode[i] = i % 9;
            }
        }

        public string GetRegisterNum(string MachineNume)
        {
            IntiIntCode();
            if (MachineNume.Length != 25)
                return "机器编码有误,请重新输入!";
            //通过机器码获取ASCII码
            for (int i = 1; i < m_charASCII.Length; i++)
            {
                m_charASCII[i] = Convert.ToChar(MachineNume.Substring(i - 1, 1));
            }
            //通过简单算法,改变ASCII的值, ASCII的值,再加上初始化密钥的值
            for (int j = 1; j < m_intASCII.Length; j++)
            {
                m_intASCII[j] = Convert.ToInt32(m_charASCII[j]) + m_intCode[Convert.ToInt32(m_charASCII[j])];
            }
            string MachineASCII = "";
            for (int k = 1; k < m_intASCII.Length; k++)
            {
                if ((m_intASCII[k] >= 48 && m_intASCII[k] <= 57) || (m_intASCII[k] >= 65 && m_intASCII[k] <= 90) || (m_intASCII[k] >= 97 && m_intASCII[k] <= 122))
                {
                    MachineASCII += Convert.ToChar(m_intASCII[k]).ToString();  //在0-9,A-Z,a-z之间
                }
                else if (m_intASCII[k] > 122)
                {
                    MachineASCII += Convert.ToChar(m_intASCII[k] - 10).ToString(); //大于z
                }
                else
                {
                    MachineASCII += Convert.ToChar(m_intASCII[k] - 9).ToString();
                }
            }
            return MachineASCII;
        }


        private void but_Reg_Click(object sender, EventArgs e)
        {
            textBox2.Text = "";
            textBox2.Text = GetRegisterNum(textBox1.Text);
        }

        private void btn_Cancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}




3、再回到主界面进行注册





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值