陈宝刚---享受生活,追逐梦想!
理想是心中的火焰,有追求的人才是幸福的人!

主要思路:获取机器的CPU序列号,得到机器码。通过对机器码进行MD5运算之后得到注册码。将注册码写进注册表或系统目录。

//1.在程序的入口处(winform)检测注册文件是否存在,如果不存在

//则提示用户注册文件损坏或者用户未注册,如果注册文件存在,则读取文件内容,判断注册码是否正确。
//在程序的入口函数所在的文件要引用 using System.IO;来进行文件操作。

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;


namespace LoginWindowTest
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            String sysFolder = System.Environment.SystemDirectory;//获取系统安装目录如:c:\windows\system32
            Reg rg=new Reg();//此类里有几个函数(获取CPU序列号,对字符串进行MD5运算等)
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            if (!File.Exists(sysFolder + "http://www.cnblogs.com/chenbg2001/admin/file://sixi.ini/"))
            {
                //如果注册文件不存在。注册失败
                //创建注册文件
                File.Create(sysFolder + "http://www.cnblogs.com/chenbg2001/admin/file://sixi.ini/");

                MessageBox.Show("请注册!");
                Application.Run(new RegForm());//进入注册界面。

            }
            else
            {//如果注册文件存在,读取文件内容跟密码比较
                byte[] arry=new byte [32];
                string str = "";
                FileInfo fi = new FileInfo(sysFolder + "http://www.cnblogs.com/chenbg2001/admin/file://sixi.ini/");
                FileStream fs = fi.OpenRead();
                int i=fs.Read(arry, 0, 32);
                fs.Close();
                str = System.Text.Encoding.ASCII.GetString(arry);
                if (str == rg.getMd5(rg.GetCpuID()).Trim())//如果注册文件里的字符串和经过MD5运算过的注册码相同,则注册成功
                {
                    MessageBox.Show("软件已经成功注册!");
                       Application.Run(new MainForm());//进入软件主界面
                }
                else
                {
                    MessageBox.Show("请注册软件!");
                       Application.Run(new RegForm());//进入注册界面。
                }
              
            }
                      
        }
    }
}

//2.Reg类,获取CPU序列号、对字符串进行MD5加密等。需要引用System.Managerment
//你也可以对这个类进行优化,把验证注册码也放在这个里面,可以写一个方法,比如:Public bool ISRight()

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;


namespace LoginWindowTest
{
    class Reg
    {
        //取CPU编号
        public string GetCpuID()
        {
            try
            {
                ManagementClass mc = new ManagementClass("Win32_Processor");
                ManagementObjectCollection moc = mc.GetInstances();

                String strCpuID = null;
                foreach (ManagementObject mo in moc)
                {
                    strCpuID = mo.Properties["ProcessorId"].Value.ToString();
                    break;
                }
                return strCpuID;
            }
            catch
            {
                return "";
            }

        }//end method

        //取第一块硬盘编号,因为移动硬盘的复杂性,所以不建议加密时同时对CPUID和HDID操作,如果用户把移动硬盘设为启动盘,就会造成注册码和机器码经过运算后不符合的错误。
        public string GetHardDiskID()
        {
            string HDid = "";
            try
            {

                ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
                ManagementObjectCollection moc1 = cimobject1.GetInstances();
                foreach (ManagementObject mo in moc1)
                {
                    HDid = (string)mo.Properties["Model"].Value;


                }
                return HDid;
            }
            catch
            {
                return "";
            }
        }

        public string getMd5(string md5)
        {
            System.Security.Cryptography.MD5CryptoServiceProvider md = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] value, hash;
            value = System.Text.Encoding.UTF8.GetBytes(md5);
            hash = md.ComputeHash(value);
            md.Clear();
            string temp = "";
            for (int i = 0, len = hash.Length; i < len; i++)
            {
                temp += hash[i].ToString("x").PadLeft(2, '0');
            }
            return temp;
        }
    }
}

 

////3.注册页面可以这样写:

private void button3_Click(object sender, EventArgs e)
        {
            Reg rg = new Reg();
            String sysFolder = System.Environment.SystemDirectory;
            //注册,
            //1.修改app.config
            if (textBox2.Text.Trim() != rg.getMd5(GetCpuID()))
            {
                MessageBox.Show("注册码错误!");
            }
            else
            {
                MessageBox.Show("注册成功!");
                File.WriteAllText(mailto:sysFolder+@"%20sixi.ini", rg.getMd5(rg.GetCpuID()));

                //可以进入软件的主界面。或重新启动本程序。
            }

        }

////////////////////////////////////////////////////////////

///////////////////////OVER

///////////////////////////////////////////////////////////

开头的时候说了,这个只是注册软件的简单的实现。如果你想更复杂一点儿,你还可以对机器码(CPUID)进行一些复杂的运算。这个需要你自己设计一个复杂的算法。你也可以把注册码写进注册表。

posted on 2009-07-17 10:58  追梦人RUBY  阅读(1219)  评论(0编辑  收藏  举报