Flexnet通关后传-license文件自动部署解决方案
前言: 感谢前人的工作,厉害了我的谁、laoqian、方向感、NoFlexlm、yangmyron等前辈大牛,这里不一一列举了。
原本以为Flexnet研究成功后,万事大吉,谁知后面的License文件管理也大为头疼。定期更新License文件也需要大量的时间,而且替换截止日期、生成SIGN字符串等很多都是重复性的操作,不胜其烦。本文不介绍Flexnet的知识,分享了一套自动部署系统的开发和实践过程,供参考。
严格地讲,本文不属于逆向,但是因逆向而生,所以放在本主题,不妥请版主帮忙揶下。
准备工作
【Flexnet界第一神器】lmcrypt.exe,更新签名
【开发语言】C#或python,开发License文件生成图形界面软件
【部署工具】Jenkins,用于持续集成,实现自动部署
【发布工具】wingFtp,一个可以针对不同用户账号管理的FTP/sFTP软件
【目标】摆脱乏味重复劳动,定期自动发布License文件给不同的用户账号
第一步,编辑License文件
整理原始License文件形成模板。在图形界面软件CreateLic.exe(以下简称CreateLic.exe)中读取模板文件,并完成日期替换、HostID编辑等动作,从而生成新的License文件。此时新License文件中的签名SIGN还是旧的,无效的。
第二步,更新签名SIGN
将新License文件拖到lmcrypt.exe软件上,更新签名SIGN。当然,为了实现自动部署功能,这个更新过程也要合并到CreateLic.exe中。
C#可以利用process类调用外部程序以及执行DOS命令。
到这里,CreateLic.exe基本功能开发完成,但是还不够,因为第一步和第二步的工作只考虑了生成单个文件的情况,而实际生产中有一批批的License文件需要生成。
第三步,批量生成License文件
批量生成功能主要是管理生成License文件前的参数。我们将需要设置的参数统一放在配置文件中。配置文件格式可以用INI、XML或TXT,甚至是SQLite、MySQL数据库。操作数据库时,用“动软代码生成器”自动生成数据库三层结构代码,可以大大简化开发流程。完成参数设置后,一键批量生成可用的License文件,这个批量生成功能是本自动部署系统的关键,也要合并到CreateLic.exe中。
注:“动软代码生成器”是一款国产优秀的数据库代码生成软件,使用界面很友好,上手很快。软件集成了微软T4模板语言引擎,支持模板自定义,可自定义生成C#/VB/PYTHON等各类代码。目前已停止维护,网上有一份低版本的开源代码,最后一版是v2.78。
第四步,增加命令行功能
之前的CreateLic.exe都是在图形界面下操作的,方便手动生成。但是地球人都知道,自动化操作是需要命令行的。为此,我们的CreateLic.exe也增加命令行功能。
在C#工程的program.cs文件中,编写支持命令行参数的代码。
在Frm1.cs文件中修改两个与命令行有关的初始类和默认加载类。
默认加载类Frm1_Load()中,别忘记了使用“this.Close();”关闭图形界面。
顺带提一下,解析命令行参数时,可以使用林选臣大神写的方法。命令行输入--lindexi doubi,就可以得到doubi。这个方法不需要安装任何的库,性能很高,但是封装不好,足够我们日常使用了。
第五步,CreateLic.exe完善
至此,我们的CreateLic.exe开发完成。为便于实施无人执守的自动部署功能,还应该在正常的程序运行中增加日志记录。为此,可以引进log4net.dll,对日志进行分级记录和控制。
第六步,部署License文件存放服务
使用wingFtp创建用户账号和工作文件夹,并开通sftp协议监听。不要使用ftp协议监听,因为如果wingFtp软件部署在云服务器上,可能面临主动ftp模式和被动ftp模式的折腾。这样,每个用户都可以登录到自己的sFTP账号名下,获取各自的License文件。
第七步,自动部署功能
因每隔一段时间License文件会失效,经常我们需要定期批量更新。为此,我们借助Jenkins软件来实现甩手掌柜的最后一步。Jenkins软件有很多插件扩展功能,非常适合于持续集成。且Jenkins支持多种部署方式,部署便捷,使用界面十分友好,上手很快。自动部署功能工作过程如下:
1)【可选,方便集成】Jenkins通过SVN/Git获取CreateLic.exe;
2)Jenkins调用CreateLic.exe生成新License文件;
3)通过Publish over SSH插件,发布新License文件到各sFTP账号下;
4)【可选】Jenkins重启License服务器,更新License文件;
5)邮件通知各ftp账号用户。
配置构建触发器,定期自动触发上述部署过程。为方便集成,我们可以提交CreateLic.exe源码到SVN/Git,并编写编译脚本。如果再在Jenkins中增加一个CreateLic.exe系统测试Project,那就实现了从源码管理到生产部署的全套持续部署系统了,此是后话。
不过,如果在局域网中,使用windows-“系统工具”自带的“任务计划程序”实现定时运行,发布到共享文件夹,一样可以实现本方案的定时自动部署的功能。和本方案相比,优点是简单快捷,缺点是部署出错的话不好监控。
通过以上步骤,一套License文件自动部署系统就开发和搭建完成。后面有新的License需求时,我们只需要维护CreateLic.exe参数文件和Jenkins配置,大侠们又可以腾出手脚去攻克Flexnet难题了。
System.Diagnostics.Process proc
=
new System.Diagnostics.Process();
proc.StartInfo.FileName
=
"\""
+
“CreateLic.exe”
+
"\""
;
/
/
程序名
proc.StartInfo.Arguments
=
"\""
+
strArgs
+
"\""
;
/
/
执行参数
为了美观,可以隐藏运行过程中的DOS窗口。
proc.StartInfo.UseShellExecute
=
false;
proc.StartInfo.CreateNoWindow
=
true;
如果需要调试,可以用以下语句显示运行过程中的DOS窗口信息。
/
/
proc.StartInfo.UseShellExecute
=
true;
/
/
proc.StartInfo.CreateNoWindow
=
false;
process.Start();
/
/
执行
System.Diagnostics.Process proc
=
new System.Diagnostics.Process();
proc.StartInfo.FileName
=
"\""
+
“CreateLic.exe”
+
"\""
;
/
/
程序名
proc.StartInfo.Arguments
=
"\""
+
strArgs
+
"\""
;
/
/
执行参数
为了美观,可以隐藏运行过程中的DOS窗口。
proc.StartInfo.UseShellExecute
=
false;
proc.StartInfo.CreateNoWindow
=
true;
如果需要调试,可以用以下语句显示运行过程中的DOS窗口信息。
/
/
proc.StartInfo.UseShellExecute
=
true;
/
/
proc.StartInfo.CreateNoWindow
=
false;
process.Start();
/
/
执行
static void Main(string[] args)
/
/
增加命令行参数
{
if
(args.Length
=
=
0
)
{
Application.Run(new Frm1());
/
/
无命令参数,运行默认图形程序
}
else
{
Application.Run(new Frm1(args));
/
/
有命令参数,解析命令行
}
}
static void Main(string[] args)
/
/
增加命令行参数
{
if
(args.Length
=
=
0
)
{
Application.Run(new Frm1());
/
/
无命令参数,运行默认图形程序
}
else
{
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-12-9 20:31
被tcy027编辑
,原因: