zoukankan      html  css  js  c++  java
  • C# 实现软件注册功能

    相信很多初学编程的人都会对这个注册功能很感兴趣,我也不例外,刚学asp.net时,竞找不到这方面的实例,结果自己参考微软的一些文档自己做了一个,其实我做的这个注册功能很简单,读取计算机的CPU序列号,用MD5加密(经过处理)生成一个机器码,然后再把这个机器码处理一下就生成了注册码,在asp.net的配置文件web.config中加了一个键,用于存储注册码,程序运行时读取机器码,然后再生成注册码,对照一下配置文件内的注册码,如果一致就说明程序已注册,否则未注册。同时也做了一个注册机,用于生成注册码。注册机运行结果:
    下面是代码:
    1、首先是读取机器序列号的类Hardware,网上找来的

    using System;
    using System.Runtime.InteropServices;
    using System.Management;
    namespace Hardware
    {
    /// summary
    /// Hardware_Mac 的摘要说明。
    /// /summary
    public class HardwareInfo
    {
    //取机器名
    public string GetHostName()
    {
    return System.Net.Dns.GetHostName();
    }
    //取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
    //取第一块硬盘编号
    public String GetHardDiskID()
    {
    try
    {
    ManagementObjectSearcher searcher =
    new ManagementObjectSearcher(SELECT * FROM Win32_PhysicalMedia);
    String strHardDiskID = null;
    foreach (ManagementObject mo in searcher.Get())
    {
    strHardDiskID = mo[SerialNumber].ToString().Trim();
    break;
    }
    return strHardDiskID;
    View Code

    主要思路:获取机器的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:windowssystem32
    Reg rg=new Reg();//此类里有几个函数(获取CPU序列号,对字符串进行MD5运算等)
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    if (!File.Exists(sysFolder + "\sixi.ini"))
    {
    //如果注册文件不存在。注册失败
    //创建注册文件
    File.Create(sysFolder + "\sixi.ini");
    MessageBox.Show("请注册!");
    Application.Run(new RegForm());//进入注册界面。
    
    }
    else
    {//如果注册文件存在,读取文件内容跟密码比较
    byte[] arry=new byte [32];
    string str = "";
    FileInfo fi = new FileInfo(sysFolder + "\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());//进入注册界面。
    }
    
    }
    
    }
    }
    }
    View Code

    //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(sysFolder+@"sixi.ini", rg.getMd5(rg.GetCpuID()));
    //可以进入软件的主界面。或重新启动本程序。
    }
    }
    View Code

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

  • 相关阅读:
    script标签加载顺序(defer & async)
    nginx反向代理vue访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
    Git每次进入都需要输入用户名和密码的问题解决
    update select
    sql --- where concat
    GO -- 正则表达式
    浏览器中回车(Enter)和刷新的区别是什么?[转载]
    转: Linux --- Supervisor的作用与配置
    Golang 使用Map构建Set类型的实现方法
    linux -- 查看应用启动时间
  • 原文地址:https://www.cnblogs.com/blogpro/p/11340623.html
Copyright © 2011-2022 走看看