野鸭鸭

制作公司ERP自动安装工具的经验

公司现在使用的ERP每次安装都需要经过:配置IE浏览器,安装,配置Hosts和配置外网四个步骤,谈不上任务繁重,但是繁琐,是真的。想了个办法,制作一个简单的自动安装和配置工具,让普通用户能自行安装。

第一次做企业环境的工具,没有技术和经验的累积,导致来来回回好多遍,才终于在上周勉强实现目标:在内网环境下,用户只需点点点,就可以完成原来四个步骤的操作,让普通销售、采购和技术等部门的同时,可以在需要的时候,自己完成ERP的安装和配置工作。

逻辑分析

配置IE浏览器的目的只是为了在线下载ERP的安装文件而已,如果通过自动工具实现,则可以跳过这一步。

安装过程,需要依赖安装文件的存在,所以要实现自动下载安装文件的功能。

配置Hosts文件需要获取管理员权限,才能更新Hosts文件内容。

配置外网是通过新建快捷图标,配置快捷图标启动参数的方式实现的,所以要自动创建快捷图标。

方案选择

最开始做的时候,我首先考虑使用自己熟悉的.NET来进行开发,界面方面选择了次新的WPF。很快就遇到了问题,WPF的发布方式是通过ClickOnce进行,而ClickOnce获取管理员权限比较麻烦,没有搞会,我又转战了WinForm。没有想到,WinForm的发布方式也是ClickOnce,而不是我想象中的像以前VB那样,直接编译一个EXE文件出来,又继续寻找ClickOnce获取管理员权限的办法,还好后来基本搞定了。

就在我兴奋的时候,发现安装到其他人电脑上,却提示要安装.NET Framework。脑子一拍,怀疑自己是不是傻掉了,在用.NET开发,却忘记部署的前提是需要安装.NET的,以为安装程序会根据本机.NET安装情况自动执行安装,以为安装.NET会非常快。然并卵,并不会自己安装,而且安装很慢,要等很久。更可怕的是,我使用默认的.NET Framework 4.6.1开发的,而公司还有不少使用XP的电脑,.NET Framework压根无法安装在XP上。

再几经搜索,决定使用BAT批处理实现,于是从BAT变量的使用开始查看文档一步步制作。后来卡在了如何通过BAT下载安装文件这个问题上。终于在多次搜索下,找到了是用curl下载这个好办法,而且命令非常简单。又Copy了别人通过BAT创建快捷图标的代码,终于通过BAT实现了。再次兴奋起来,跑去同事电脑测试,结果悲剧了。curl不是系统自带的命令行工具,是需要手动安装的。我就纳闷了,为什么我电脑上直接就有curl。坑惨了。

我不能放弃,我回到了.NET平台。我觉得强大的.NET几乎可以在Windows里面做任何事情,我觉得应该是有办法解决我这个小问题的。终于,发现了两个问题:Windows 7自带.NET Framework 3.5,ClickOnce可以添加预设环境文件下载功能。也就是说,我可以通过降低所使用.NET Framework到3.5版本,就可以让程序无需手动安装.NET Framework,现在Windows 7用户那边先用起来,即便是必须要高版本,也可以讲高版本通过预设环境文件的功能,快速下载到客户机,进行安装。

在测试可行之后,最终选定了.NET + WinForm的方式进行。下一步打算尝试WPF看看。

核心功能

配置Hosts文件

有两个难点:第一、循环读取和判断有无重复Hosts内容,仅添加没有重复的Hosts内容;第二、写入Hosts内容需要获取管理员权限。

重复内容判断

using (System.IO.StreamReader sr = new System.IO.StreamReader(hostFilePath))
{
string line;
while ((line = sr.ReadLine()) != null)
{
if (line.Contains(internalHost))
{
internalHostExisting = true;
}

if (line.Contains(externalIP))
{
externalHostExisting = true;
}
}
}

获取管理员权限

怎么获取管理员权限的,我都已经忘记了。O(∩_∩)O

在线获取安装文件

在.NET中,在线获取安装文件的方式难度不大,有很多。我在书上看到的,通过WebClient的方式进行。

string server = "http://"+ ( isInternal ? internalIP : externalIP) ;
string fileInstaller = server + "/files/setup8.exe";
string fileIni = server +"/files/"+ (isInternal ? "internal" : "external") + "/setup.ini";
string fileSavePath = desktopPath + @"\JSERP\";
string fileInstallerSavePath = fileSavePath + @"\setup8.exe";
string fileIniSavePath = fileSavePath + @"\setup.ini";

Directory.CreateDirectory(fileSavePath);

System.Net.WebClient wc = new System.Net.WebClient();
wc.DownloadFile(fileInstaller, fileInstallerSavePath);
wc.DownloadFile(fileIni, fileIniSavePath);
wc.Dispose();

执行安装

自动执行安装也比较简单,通过Process方式进行。

System.Diagnostics.Process p = new System.Diagnostics.Process();
string setupFileName = desktopPath + @"\JSERP\\setup8.exe";
p.StartInfo.FileName = setupFileName;
p.Start();
p.WaitForExit();

创建快捷图标

这块以前从来没有接触过,书上和网上也没有见到过,完全靠搜索来的。大体是上要添加Windows Scipts之类的COM组建,然后创建快捷图标。虽然没有接触过,但是Copy Paste and Edit别人的代码,还是能直接使用的。

string shortcutLocation = System.IO.Path.Combine(desktopPath, shorcutName);
WshShell shell = new WshShell();
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutLocation);
shortcut.Description = "JSERP";
shortcut.IconLocation = defaultJserpProgramPath;
shortcut.TargetPath = defaultJserpProgramPath;
shortcut.Arguments = shorcutParameter;
shortcut.Save();

里予甲鸟甲鸟

我有钱,我高大,我帅气,我还没睡醒!谁叫醒我,就打谁哦。

添加评论

联系

即刻M我/Q我