且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能

更新时间:2022-09-13 18:38:47

原文:.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能

        接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证。

        代码控制许可证的意思就是软件经过.net reactor保护后,到期时客户端就需要购买许可证,这时软件开发商就需要生成许可证等操作,这个操作可以由代码控制来达到自动化的效果。当然不仅仅是生成操作,还包扩获取许可证的信息,作废许可证,激活许可证等操作。

        在安装目录下...\.NET Reactor\SDK\Binaries文件夹下可以找到License.dll和LicenseGen.dll(.net编写 .net reactor是一个.net 编写的程序)。其中License.dll主要用于获取许可证信息,作废许可证,激活许可证等,可整合到软件项目中,而LicenseGen.dll主要用于生成许可证,不可整合,可以用于许可证自动生成的服务。

        首先看下许可证生成代码:

        /// <summary>
        /// 创建许可证
        /// </summary>
        /// <param name="project_filename"></param>
        private void CreateLicenseFile()
        {
            LicenseGenerator licensegen = new LicenseGenerator();
            licensegen.AddAdditonalLicenseInformation("Company", "Eye");
            licensegen.Hardware_Enabled = true;
            licensegen.HardwareID = "1234-1234-1234-1234-1234";
            licensegen.CreateLicenseFile(@"C:\newlicense.license");
        }
         这将会在c盘下生成newlicense.license许可证文件,文件的内容包括添加进去的键值对Company-Eye,开启硬件锁,此许可证只针对硬件编码为1234-1234-1234-1234-1234的机器有效。

        再来看看License.dll的功能:

        /// <summary>
        /// 许可证是否可用
        /// </summary>
        /// <returns></returns>
        private bool IsValidLicenseAvailable()
        {
            return License.Status.Licensed;
        }

        /// <summary>
        /// 获取许可证键值信息
        /// </summary>
        private string ReadAdditonalLicenseInformation()
        {
            string rtnStr = string.Empty;
            if (License.Status.Licensed)
            {
                for (int i = 0; i < License.Status.KeyValueList.Count; i++)
                {
                    string key = License.Status.KeyValueList.GetKey(i).ToString();
                    string value = License.Status.KeyValueList.GetByIndex(i).ToString();

                    rtnStr += key + "-" + value + Environment.NewLine;
                }
            }
            return rtnStr;
        }

        /// <summary>
        /// 获取软件锁定信息
        /// </summary>
        /// <returns></returns>
        private string ReadLockMsg()
        {
            string rtnStr = string.Empty;
            //使用持续时间锁
            bool lock_enabled = License.Status.Evaluation_Lock_Enabled;
            License.EvaluationType ev_type = License.Status.Evaluation_Type;
            int time = License.Status.Evaluation_Time;
            int time_current = License.Status.Evaluation_Time_Current;
            rtnStr += string.Format("是否开启持续时间锁:{0},规定使用最大持续时间{1},现在使用时间{2}\n",lock_enabled.ToString(),time.ToString(),time_current.ToString());

            //到期锁
            bool lock_enabled1 = License.Status.Expiration_Date_Lock_Enable;
            System.DateTime expiration_date = License.Status.Expiration_Date;
            rtnStr += string.Format("是否开启到期锁:{0},到期时间{1}\n", lock_enabled1.ToString(), expiration_date.ToShortTimeString());

            //使用次数锁
            bool lock_enabled2 = License.Status.Number_Of_Uses_Lock_Enable;
            int max_uses = License.Status.Number_Of_Uses;
            int current_uses = License.Status.Number_Of_Uses_Current;
            rtnStr += string.Format("是否开启使用次数锁:{0},最大使用次数{1},当前使用次数{2}\n", lock_enabled2.ToString(), max_uses.ToString(), current_uses.ToString());

            //并发运行锁
            bool lock_enabled3 = License.Status.Number_Of_Instances_Lock_Enable;
            int max_instances = License.Status.Number_Of_Instances;
            rtnStr += string.Format("是否限制并行数量:{0},最大并行数量:{1}\n", lock_enabled3, max_instances.ToString());

            //硬件锁
            bool lock_enabled4 = License.Status.Hardware_Lock_Enabled;
            string lic_hardware_id = "";
            if (lock_enabled)
            {
                lic_hardware_id = License.Status.License_HardwareID;
            }
            rtnStr += string.Format("证书是否开启硬件锁{0},对于特定硬件的有效{1}\n", lock_enabled4.ToString(), lic_hardware_id);
            return rtnStr;
        }

        /// <summary>
        /// 获取机器硬件编号
        /// </summary>
        /// <returns></returns>
        private string GetHardwareID()
        {
            return License.Status.HardwareID;
        }

        /// <summary>
        /// 获取许可证适用的硬件编码
        /// </summary>
        /// <returns></returns>
        private string GetLicenseHardwareID()
        {
            return License.Status.License_HardwareID;
        }

        /// <summary>
        /// 作废许可证
        /// </summary>
        private string InvalidateLicense()
        {
            string confirmation_code = License.Status.InvalidateLicense();
            return confirmation_code;
        }

        /// <summary>
        /// 检查作废许可证的验证码是否有效
        /// </summary>
        /// <param name="confirmation_code"></param>
        /// <returns></returns>
        public bool CheckConfirmationCode(string confirmation_code)
        {
            return License.Status.CheckConfirmationCode(License.Status.HardwareID,
            confirmation_code);
        }

        /// <summary>
        /// 重新激活许可证
        /// </summary>
        /// <param name="reactivation_code"></param>
        /// <returns></returns>
        public bool ReactivateLicense(string reactivation_code)
        {
            return License.Status.ReactivateLicense(reactivation_code);
        }
        其中作废许可证及激活许可证的主要应用场景是:如果许可证开启硬件锁,客户端想从一个机器移动许可证到另一个机器此时就需要先作废许可证,然后在新机器里重新激活许可证。作废许可证可直接调用即可,但是激活许可证需要打开Tools->LicenseReactivation Tool来根据硬件编码生成激活码,传入即可激活许可证。(这里生成激活码我只找到在工具里可视化操作,在代码中找不到这种方法,所以这个应用场景不太适合许可证全自动化的管理)。

        本文代码下载地址:http://yunpan.cn/cJnMmILrX9Av2 访问密码 2585


        下一篇主要学习下.net reactor的简单应用场景