我所使用的注册码方法只是基于本地的CPUID与硬盘的编码并进行.开发人员使用SoftReg 类根据唯一机器码生成唯一注册码,发给客户,客户注册之后就可以用,注册未成功时会在本地注册表生成一个使用次数,注册成功则生成一个指示注册成功的值或者直接保存注册码在本地注册表中也是可以的
private int[] intCode = new int[127]; // 存储密钥
private char[] charCode = new char[25]; // 存储机器码字
private int[] intNumber = new int[25]; // 存机器码的Ascii值
/// <summary>
/// 获取CPU
/// </summary>
/// <returns>CPU字符串</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 GetDiskVolumeSerialNumber()
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"d:\"");
disk.Get();
return disk.GetPropertyValue("VolumeSerialNumber").ToString();
}
/// <summary>
/// 得到机器码
/// </summary>
/// <returns>机器码</returns>
public string getMNum()
{
string strNum = getCPU() + GetDiskVolumeSerialNumber(); //获得24位Cpu和硬盘序列号
string strMNum = strNum.Substring(0, 24); //从生成的字符串中取出前24个字符做为机器码
return strMNum;
}
/// <summary>
/// 获得注册码
/// </summary>
/// <returns>注册码字符串</returns>
public string getRNum()
{
SetIntCode();
string strMNum = getMNum();
for (int i = 1; i < charCode.Length; i++) //存储机器码
{
charCode[i] = Convert.ToChar(strMNum.Substring(i - 1, 1));
}
for (int j = 1; j < intNumber.Length; j++) //改变ASCII码值
{
intNumber[j] = Convert.ToInt32(charCode[j]) + intCode[Convert.ToInt32(charCode[j])];
}
string strAsciiName = ""; //注册码
for (int k = 1; k < intNumber.Length; k++) //生成注册码
{
if ((intNumber[k] >= 48 && intNumber[k] <= 57) || (intNumber[k] >= 65 && intNumber[k]
<= 90) || (intNumber[k] >= 97 && intNumber[k] <= 122)) //判断如果在0-9、A-Z、a-z之间
{
strAsciiName += Convert.ToChar(intNumber[k]).ToString();
}
else if (intNumber[k] > 122) //判断如果大于z
{
strAsciiName += Convert.ToChar(intNumber[k] - 10).ToString();
}
else
{
strAsciiName += Convert.ToChar(intNumber[k] - 9).ToString();
}
}
return strAsciiName;
}
/// <summary>
/// 给数组赋值小于10的数
/// </summary>
public void SetIntCode()
{
for (int i = 1; i < intCode.Length; i++)
{
intCode[i] = i % 9;
}
}
这些函数就可以生产机器码和注册码
根据客户发回的机器码则生成注册码了
private void MainForm_Load(object sender, EventArgs e)
{
try
{
//判断软件是否注册
RegistryKey retkey = Registry.CurrentUser.OpenSubKey("SOFTWARE", true).CreateSubKey("mySoftWare").CreateSubKey("Register.INI");
foreach (string strRNum in retkey.GetSubKeyNames())
{
if (strRNum == getRNum())
{
this.label3.Text = "此软件已注册!";
this.btnReg.Enabled = false;
return;
}
}
this.label3.Text = "此软件尚未注册!";
this.btnReg.Enabled = true;
MessageBox.Show("您现在使用的是试用版,可以免费试用30次!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
Int32 tLong; //已使用次数
try
{
tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0);
MessageBox.Show("您已经使用了" + tLong + "次!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch
{
MessageBox.Show("欢迎使用本软件!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0, RegistryValueKind.DWord);
}
//判断是否可以继续试用
tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0);
if (tLong < 10)
{
int tTimes = tLong + 1;
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", tTimes);
}
else
{
MessageBox.Show("试用次数已到!请注册!", "信息", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show("请以管理员身份运行!");
this.Close();
}
txtMachineNum.Text = getMNum();
}
注册码效验程序
```csharp
```csharp
private void btnReg_Click(object sender, EventArgs e)
{
try
{
if (txtRegNum.Text == getRNum())
{
MessageBox.Show("注册成功!重启软件后生效!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
RegistryKey retkey = Registry.CurrentUser.OpenSubKey("Software", true).CreateSubKey("mySoftWare").CreateSubKey("Register.INI").CreateSubKey(getRNum());
retkey.SetValue("UserName", "Rsoft");
this.Close();
}
else
{
MessageBox.Show("注册码错误!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}