[转].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 = ; 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 学习系列(三)---.net reactor代码自动操作相关保护功能的更多相关文章
- .net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能
原文:.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能 接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证. ...
- .net reactor 学习系列(二)---.net reactor界面各功能说明
原文:.net reactor 学习系列(二)---.net reactor界面各功能说明 安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.c ...
- .net reactor 学习系列(四)---.net reactor应用场景
原文:.net reactor 学习系列(四)---.net reactor应用场景 前面已经学习了.net reactor一些基础知识,现在准备学习下实际的应用场景,只是简单的保护和 ...
- .net reactor 学习系列(一)---.net reactor介绍
原文:.net reactor 学习系列(一)---.net reactor介绍 学习.net已经一年多了,从语言的编写到框架类库的运用再到.net三大解决方案的了解(WF,WCF,WPF ...
- [转].net reactor 学习系列(二)---.net reactor界面各功能说明
安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.chm,目前没有中文版本,里面详细介绍了.net reactor的各功能及使用场景.本系列文章是基于此帮助文档 ...
- [转].net reactor 学习系列(四)---.net reactor应用场景
前面已经学习了.net reactor一些基础知识,现在准备学习下实际的应用场景,只是简单的保护和许可证发放场景.如果想应用更高级的场景比如自动化程序许可证的发放及自定义客户端的过期提示等等就需要自己 ...
- Spring学习系列(三) 通过Java代码装配Bean
上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean 二.通过Java类装配bean 在前面定义了HelloWorldConfig类,并使用@Compon ...
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- scrapy爬虫学习系列三:scrapy部署到scrapyhub上
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
随机推荐
- 无状态Http
无状态的根本原因 浏览器和服务器使用socket通信,服务器将请求结果返回给浏览器后,会关闭当前socket连接.而且服务器会在处理页面完毕后销毁页面对象. 应用层面的原因 浏览器和服务器之间通信都遵 ...
- 中国区的Azure添加到 VSTS 的 Service Endpoint
把中国区的Azure添加到 VSTS (Visual Studio Team System) 的 Service Endpoint. 这个是使用 VSTS 自动部署到中国区Azure的前置条件. Se ...
- ftp--vsftp\pureftpd
FTP是File Transfer Protocol(文件传输协议),用于Internet上的控制文件的双向传输. 现今常用在一个局域网内,如学校.公司等一个指定范围的区域.(因为太过于简单和不安全) ...
- Linux/Unix 怎样找出并删除某一时间点的文件
Linux/Unix 怎样找出并删除某一时间点的文件 在Linux/Unix系统中,我们的应用每天会产生日志文件,每天也会备份应用程序和数据库,日志文件和备份文件长时间积累会占用大量的存储空间,而有些 ...
- C# 获取计算机cpu,硬盘,内存相关的信息
using System;using System.Management; namespace MmPS.Common.Helper{ /// <summary> /// 获取计算机相关的 ...
- 洛谷 P2369 EXCEEDED WARNING A 题解
题目传送门 直接用sort排序最后输出即可.但是数组要使用short int 类型.否则会超内存. #include<bits/stdc++.h> using namespace std; ...
- Ant, JUnit以及Sonar的安装+入门资料
Ant 感觉是个和Make/Grunt类似的东东,build一个项目用的.安装很容易,跟装JDK类似,就是解压->设环境变量->没了.注意装之前要先确认Java装好了(有点废话). 下载地 ...
- [笔记]用gdb调试core dump
总是隔一段时间才写一次C++,有些东西老是用完就忘了……记一下如何用gdb来调试core dump免得到时候又忘记. 首先需要设置core file的大小,默认是0所以不设不会生成core file ...
- Python全栈开发之2、运算符与基本数据结构
运算符 一.算数元算: 读者可以跟着我按照下面的代码重新写一遍,其中需要注意的是,使用除的话,在python3中可以直接使用,结果是4没有任何问题,但是在python2中使用的话,则不行,比如 9/2 ...
- PouchDB:JavaScript同步数据库
简介 PouchDB是受 Apache CouchDB启发为Web设计的一款占用空间少的数据库.PouchDB项目的目标是帮助开发者构建线上和线下都能很好地使用的Web应用程序,在应用程序离线的时候, ...