主要思路:擷取機器的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)進行一些複雜的運算。這個需要你自己設計一個複雜的演算法。你也可以把註冊碼寫進註冊表。