最近有个项目,以c/s架构开发,客户端需要部署到50多台客户机上。但是软件的维护管理(包括安装、更新等)都由一个人来做,此人也不希望客户端程序自己悄悄更新。所以必须设计一种软件远程批量安装和更新的方案,来支持用户提出的这种需求。
问了一下度娘,发现PSTools这个工具非常好用。于是决定试一试。
思路其实很简单,以一台机器作为管理机,将需要更新的程序、文件及更新工具放在管理机上。管理员从管理机上远程控制其他客户机,依次在每台客户机上安装或更新软件。人工操作的方式就是一台台的通过远程桌面连接来进行。而我采用的办法只是将人工操作改为了通过脚本来自动实现。
远程安装或更新的步骤如下:
1)将管理机上放置待更新程序和文件的文件夹设置为共享文件夹。
2)从管理机共享文件夹中拷贝待更新程序和文件到远程客户机的指定位置上。
3)杀掉远程客户机上老的程序。
4)备份远程客户机上老程序的个性化配置文件。
5)删除远程客户机上老程序的安装目录。
6)在远程客户机上静默安装新的客户端程序。
7)还原远程客户机的个性化配置文件。
8)启动远程客户机上的客户端程序。
PsTools是一个工具集,包含了多个工具,此处只用到了其中的psexec.exe。该工具的主要使用命令如下:
psexec.exe \\remoteip -u username -p password -c file
其中,file必须是可执行文件,可以是脚本,可以是安装程序。
注意:此命令的使用需要管理机以Administrator(不能是具有管理员身份的其他用户名)身份登录,并知道客户机的Administrator用户的密码。且要求管理机和客户机的用户名、密码是一致的。这个要求有点高,貌似有些设置方法可以使之变得更友好。由于时间原因,及在我的应用场景下是可以满足上述条件的,具体设置方法未曾深入研究。
实现方法
完成后的批量更新工具目录如下图所示:
其中:
PsTools是从网上下载的PsTools工具包,主要需要该文件夹下的psexec.exe文件。
myclient.exe是新版客户端安装程序。
update.bat是更新每一台客户机时要调用的脚本。
batch.bat是更新所有客户机的总脚本。
使用时只需要双击batch.bat脚本即可(当然在使用前需要对脚本中的一些变量进行个性化设置)。
batch.bat脚本内容如下:
首先需要设置如下变量(这些变量一般只需要在第一次使用时设置即可):
LocalPath:批量更新工具在管理机中的本地路径。
ProgName:客户端程序的程序名。
user:管理员用户名,一般是administrator。
pwd:管理员密码。需要所有客户机与管理机的密码都相同。
可以看出,在batch.bat脚本中通过psexec.exe依次远程控制客户机来执行update.bat脚本。
update.bat脚本内容如下:
首先需要设置如下变量(这些变量一般只需要在第一次使用时设置即可):
ProgName:客户端程序的程序名。
DstDir:将更新程序和文件拷贝到客户机上的目标路径。
SharedPath:管理机的共享url。
update.bat脚本共分为如下几步:
(1)拷贝更新程序和文件到客户机的DstDir中。命令为:xcopy %SharedPath% /s %DstDir% /y
(2)杀掉客户机上的原程序。命令为:taskkill /F /im %ProgName%.exe
(3)备份个性化配置文件。命令为:xcopy "C:\Program Files (x86)\iplustek\%ProgName%\%ProgName%.exe.config" "C:\Program Files (x86)\iplustek\" /y
(4)删除原有安装目录。命令为:rd /s/q "C:\\Program Files (x86)\\iplustek\\%ProgName%"
(5)安装新程序。命令为:%DstDir%\%ProgName%.exe
(6)用个性化配置文件覆盖默认配置文件。命令为:xcopy "C:\Program Files (x86)\iplustek\%ProgName%.exe.config" "C:\Program Files (x86)\iplustek\%ProgName%\%ProgName%.exe.config" /y
(7)启动新程序。由于psexec是以dos方式远程控制客户机的,貌似无法打开界面程序。在此处未成功通过命令来启动更新后的程序。需要工作人员在使用时手动打开。
运行过程
batch.bat脚本是由许多个psexec命令组成的,每个命令的执行过程是一样的,所以以此命令为样例执行如下:
从执行过程中可以看出,在执行了psexec命令后,首先会尝试使用命令中的用户名和密码登录客户机,如果登录成功,就会进入到客户机的cmd命令行窗口(不会另外打开窗口,但实际已经切换,如下图中红色框中显示,已经进入客户机的system32目录中了)。
后面会在客户机的命令行窗口中依次执行update.bat中的每一行命令,同时可以看到命令执行结果。在本脚本中,杀掉原有已运行进程、删除原安装目录、备份还原个性化配置文件等命令在第一次安装时有可能执行失败,但是并不影响程序的批量安装。只是在安装之后需要手动进行个性化配置。
所有update.bat中的命令执行结束后,退出客户机的命令行窗口,返回到本机,如下图所示。
注意事项:使用本方法需要进行一些远程设置和防火墙设置,使用前需要考虑机群的安全性问题。