主要思路:获取机器的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)进行一些复杂的运算。这个需要你自己设计一个复杂的算法。你也可以把注册码写进注册表。