C# 软件试用限制

文章目录

  • 一、试用次数限制
  • 二、试用时间限制
    • 1.将时间写入注册表
    • 2.将时间写入文件
    • 3.将时间写入数据库
  • 三、防破解思路


一、试用次数限制

例一:http://blog.sina.com.cn/s/blog_65e635ee0100l5ny.html
例二:

MessageBox.Show("您现在使用的是试用版,该软件可以免费试用30次!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
Int32 tLong;
try
 {
     //获取软件的已经使用次数HKEY_CURRENT_USER
     //tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\tryTimes", "UseTimes", 0);
     tLong = (Int32)Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\tryTimes", "UseTimes", 0);
     MessageBox.Show("感谢您已使用了" + tLong + "次", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch
{
     //首次使用软件
     //Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\tryTimes", "UseTimes", 0, RegistryValueKind.DWord);
     Registry.SetValue("HKEY_CURRENT_USER\\SOFTWARE\\tryTimes", "UseTimes", 0, RegistryValueKind.DWord);
     MessageBox.Show("欢迎新用户使用本软件", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); 
}
    //获取软件已经使用次数
    //tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\tryTimes", "UseTimes", 0);
    tLong = (Int32)Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\tryTimes", "UseTimes", 0);
    if (tLong < 30)
    {
         int Times = tLong + 1;//计算软件是第几次使用
         //将软件使用次数写入注册表
         //Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\tryTimes", "UseTimes", Times);
         Registry.SetValue("HKEY_CURRENT_USER\\SOFTWARE\\tryTimes", "UseTimes", Times);
         this.Close();//关闭本次操作窗口 
    }
    else
    {
        MessageBox.Show("对不起,您的免费试用次数已达上限,请进行注册使用!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        Application.Exit();//关闭整个应用程序
    }

二、试用时间限制

1.将时间写入注册表

程序第一次启动时在注册表的目录下写入时间,之后每次程序运行系统时间会与设定时间进行比较。

例一:https://blog.csdn.net/cuoban/article/details/50492895
例二:https://www.cnblogs.com/chuangjie1988/articles/6647224.html
例三:固定截止时间/灵活截止时间

static class Program
{
        /// 
        /// 应用程序的主入口点。
        /// 
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            WriteRegName();

            DateTime dt0 = SelectRegName();
            //方法一:使用dt1表示固定截止时间
            DateTime dt1 = new DateTime(2022,1,10,10,30,30);
            int count = DateTime.Compare(DateTime.Now,dt1);
            //DateTimedt1程序停止
            if (count == -1 || count==0)
            {
                Application.Run(new Form1());
            }
            else
            {
                Application.Exit();
            }
           //方法二:使用灵活截止时间:将第一次启动时间写入,dt0为第一次启动时间
           int count = DateTime.Compare(DateTime.Now,dt0.AddMonths(6));
            //DateTime<.AddMonths(6)程序运行,DateTime>.AddMonths(6)程序停止
            if (count == -1 || count==0)
            {
                Application.Run(new Form1());
            }
            else
            {
                Application.Exit();
            }
        }
        /// 
        /// 判断启动项目录是否存在
        /// 
        /// 
        /// 
        static bool RegeditDirIsExist(string dirName)
        {
            RegistryKey key;
            RegistryKey subkey;
            key = Registry.LocalMachine;
            string fullDir = "software\\microsoft\\windows\\currentVersion\\";
            subkey = key.OpenSubKey(fullDir, true);
            foreach (string keys in subkey.GetSubKeyNames())
            {
                if (keys.ToLower() == dirName.ToLower())
                {
                    return true;
                }
            }
            return false;
        }

        /// 
        /// 写键值
        /// 
        static void WriteRegName()
        {
            string DirectoryName = Directory.GetCurrentDirectory();  //获取当前目录

            string regName = "WFText.exe";             //加入启动项里的节点名

            RegistryKey key;
            RegistryKey subkey;
            RegistryKey mainkey;
            string fullDir = "software\\microsoft\\windows\\currentVersion\\";
            string dir = "run";             ///注册表目录       
            string filePath = DirectoryName + "\\" + regName;    //此处注意是系统程序(如:xp下的C:\windows\system32)的话,直接写文件名即可,否则要完整的路径
            key = Registry.LocalMachine;          //初始化subkey,操作HKEY_LOCAL_MACHINE\software\microsoft\windows\currentVersion\子项        
            subkey = key.OpenSubKey(fullDir, true);

            //目录不存在则创建该目录
            if (!RegeditDirIsExist(dir))
            {
                subkey.CreateSubKey(dir);
            }
            //以可写的方式打开目录
            mainkey = key.OpenSubKey(fullDir + dir, true);
            //第一次启动时写入当前时间(此方法理论上可行,但是调试时设置好一个时间后正式使用时仍为该时间)
            if (mainkey.GetValue(regName) == null)
            {
                mainkey.SetValue(regName, DateTime.Now);
            }
        }

        /// 
        /// 根据键查询值
        /// 
        static DateTime SelectRegName()
        {
            RegistryKey key;
            RegistryKey subkey;
            RegistryKey mainkey;
            string fullDir = "software\\microsoft\\windows\\currentVersion\\";
            string dir = "run";             ///注册表目录       
            string regName = "WFText.exe";

            key = Registry.LocalMachine;          ///初始化subkey,操作HKEY_LOCAL_MACHINE\software\microsoft\windows\currentVersion\子项        
            subkey = key.OpenSubKey(fullDir, true);
            mainkey = key.OpenSubKey(fullDir + dir, true);
            DateTime dt = DateTime.Parse((string)mainkey.GetValue(regName));
            return dt;
        }
        /// 
        /// 删除键值
        /// 
        static void DeleteRegName()
        {
            RegistryKey key;
            RegistryKey subkey;
            RegistryKey mainkey;
            string fullDir = "software\\microsoft\\windows\\currentVersion\\";
            string dir = "run";             ///注册表目录       
            string regName = "WFText.exe";

            key = Registry.LocalMachine;          ///初始化subkey,操作HKEY_LOCAL_MACHINE\software\microsoft\windows\currentVersion\子项        
            subkey = key.OpenSubKey(fullDir, true);
            mainkey = key.OpenSubKey(fullDir + dir, true);

            try
            {
                mainkey.DeleteValue(regName);
            }
            catch { }
        }
    }

2.将时间写入文件

在文件夹下写入固定日期,每次打开程序时读取这个日期并且和系统时间进行比较。

public bool CheckLicence()
{
       string time= ReadTxt(TimeFile);
       DateTime Now = DateTime.Now;
            
       //Thread.Sleep(2000);
       //DateTime time = DateTime.Now;
       DateTime dt = DateTime.ParseExact(time, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
       if (DateTime.Now > dt)
       {
            MessageBox.Show("软件使用时间过期,请联系厂商");
            return true;
       }
      else
      {
      		// MessageBox.Show("未过期");
      		return false;
      }            
}
//读取日期
public static string ReadTxt(String filePath)
{
      string strData = "";
      try
      {
          string line;
          // 创建一个 StreamReader 的实例来读取文件 ,using 语句也能关闭 StreamReader
          using (System.IO.StreamReader sr = new System.IO.StreamReader(filePath))
          {
          		// 从文件读取并显示行,直到文件的末尾
          		while ((line = sr.ReadLine()) != null)
          	 {
                   //Console.WriteLine(line);
                    strData = line;
              }
            }
            catch (Exception e)
            {
                // 向用户显示出错消息
                //Console.WriteLine("The file could not be read:");
                //Console.WriteLine(e.Message);
            }
            return strData;
}
//创建日期文件
private bool CreatFile(string FullFileName, string TextAll)

{
	if (File.Exists(FullFileName))
	{
		//如果是文件已经存在;
		StreamReader sr = new StreamReader(FullFileName, Encoding.Default);
		string dattime = sr.ReadLine();
		sr.Close();
		//DateTime doe = DateTime.Now;
		//long x = Convert.ToDateTime(dattime).ToFileTime();
		//long y = doe.ToFileTime();
		//if((x-y)>0)
		//{
			// MessageBox.Show("软件剩余时间是:"+(x-y));
		//}
		//else
		//{
			//MessageBox.Show("软件试用期即将到了!");
		//}
		return true;
    }
	else
	{
		try
		{
			FileStream fs = new FileStream(FullFileName, FileMode.CreateNew);
			fs.Close();
			StreamWriter sw = new StreamWriter(FullFileName, true, Encoding.Default); //该编码类型不会改变已有文件的编码类型
			sw.WriteLine(TextAll);
			sw.Close();
			return true;
		}
		catch (Exception e)
		{
			MessageBox.Show(e.Message.ToString());	
			return false;
		}
	}
}

3.将时间写入数据库

将注册时间等信息写入数据库,每次启动程序时将时间从数据库中取出并进行比较。


三、防破解思路

(1)试用软件必须联网,或者需要服务器端(比如聊天软件等客户端软件),当前时间要取服务器的时间,防止更改客户机系统时间。或者服务器上对客户机进行记录,如记录主板id,安装时间等。
注:当客户机无法上网,且不存在服务器,或者服务器就在本机时,以上做法将无法使用。
(2) 单机运行的软件可以采用一明一暗的做法,注册表是明,在硬盘的某角落,存放隐藏文件。软件需读取两处,对两处进行比较,一致则通过,不一致就退出程序。当然,安装的时候对该文件不替换。
(3)也可以在每次运行软件时先将当前日期与注册表对比,看是否过期。如未过期,就对注册表进行一次更改,更改为当前日期,那么用户即使更改系统日期,他的试用期限也在逐渐缩小。为了防止重装,仍可采用一明一暗的做法。

你可能感兴趣的:(c#,microsoft,windows)