基于AutoIt开发内网系统补丁更新应用
2022-07-26王大权
◆王大权
基于AutoIt开发内网系统补丁更新应用
◆王大权
(大庆油田有限责任公司第二油厂第七作业区技术管理室 黑龙江 163000)
文章对利用AutoIt V3脚本语言开发系统补丁自动下载与自动更新的主要步骤进行了分析,并阐明了用该语言开发的工具体积小、免安装、占用系统资源低,适用于网络环境一般、规模小的局域网进行系统补丁更新管理。
系统补丁;AutoIt;正则表达式
1 引言
WSUS和SMS是内网中常用的补丁管理系统,它们通过中心服务器来满足内网终端对系统补丁管理的需求,对于大规模甚至是跨区域的内网,可通过逐级建立级联子服务器的方式来满足计算机对补丁管理的需求。对于规模较大局域网(以下简称内网)中的某些子网,它们远离上一级网络,存在因天气、施工、设备故障或管理等原因,造成子网暂时与周边网络不能通讯的问题,这直接影响到这些子网内的计算机对补丁更新管理的需求。此外,这些子网内一些分公司、前线小队所使用的网络,规模不大或网速一般,在使用上一级补丁服务器更新时,存在补丁更新不及时或打不上的可能,因此,在子网本地建立一个条件要求低、容易快速搭建、能快速实现补丁更新的工具,解决了上述问题,对现有的补丁管理方式也是一种补充。
2 开发语言
AutoIt v3(以下简称AU3)是用以编写并生成具有 BASIC 语言风格的脚本程序的免费软件,适用于微软公司Windows2000及以上系统,支持Windows GUI,支持强大的字符串处理语言——正则表达式,拥有众多功能强大的网络应用函数,用它开发的工具,体积小、免安装且不会向系统目录和注册表写入任何信息,能被编译成.exe类型文件,因此,AU3语言适合用于局域网补丁工具的开发。
3 工具实现系统补丁自动更新原理
工具是一个客户端软件,与内网中已建立的Web补丁页面构成了主从式架构。在客户端运行工具,通过将本地已打补丁信息与网站所提供的补丁信息名称的KB部分对比,可以实现自动筛选出计算机尚未更新的补丁信息,在利用AU3提供的相关函数实现系统补丁自动下载与自动更新。
4 工具执行系统补丁自动下载与更新的主要实现步骤
4.1 工具提取计算机已更新补丁列表
首先,利用微软系统补丁文件名称中的KB部分的唯一特性,通过AU3自带函数EnumKey()、_WinAPI_RegOpenKey()、_WinAPI_RegQueryInfoKey()从客户端计算机注册表相关项中提取计算机已更新补丁列表。图1显示了整个过程。
图1 工具提取计算机已更新补丁列表
以上代码实现了对计算机已更新补丁列表的提取。其中在枚举
Uninstall分支过程中,应注意该分支下的信息不完全是补丁的KB信息,通过正则表达式“.*?(KBd+)[^d]*?.*','$1”加上宏@extended的条件判断来准确提取出补丁KB信息。对Updates分支下的多层子项枚举过程中,RegEnumKey()函数会漏掉部分KB信息,改用WINAPIex.AU3的子函数_WinAPI_RegOpenKey()和_WinAPI_RegQueryInfoKey()对其进行深层递归枚举后,实现了对该分支的KB序列的精确提取。最后,将已更新补丁KB信息写入到FixedList.ini中。
4.2 工具提取计算机尚未更新补丁列表
利用函数_IECreate()、_IELinkGetCollection()获取WEB页面补丁链接地址信息并利用StringSplit()提取其中的KB部分,与FixedList.ini文件中的KB信息进行比较,筛选出的不同KB信息的文件就是计算机尚未更新补丁列表信息,并将这些信息写入到NewList.ini文件内。过程如下:
If @OSVersion = "WIN_2003" Then
$oIE = _IECreate("http://补丁页面.htm")
Else
…
EndIf
$oLinks = _IELinkGetCollection($oIE)
$iNumLinks = @extended
Func _GetLinkKB()
For $oLink In $oLinks
$file = StringSplit($oLink.href,"/",1)
$filekb = StringSplit($file[6],"-",1)
If IniRead("FixedList.ini","已经安装的补丁",$filekb[2],"") = "" Then
IniWrite("NewList.ini","未安装补丁",$j,$oLink.href)
EndIf
$j += 1
Next
EndFunc
4.3 批量下载
通过IniReadSection()函数读取NewList.ini文件中的补丁文件链接地址信息,使用InetGet()函数完成补丁文件的批量下载并将下载文件保存在工具文件所在目录下的Update子目录下。
Func _DownLoad()
$var = IniReadSection("NewList.ini","未安装补丁")
If @error Then
MsgBox(4096,"","读NewList.ini文件出错")
Else
For $i = 1 To $var[0][0]
$file = StringSplit($var[$i][1],"/",1)
$down = InetGet($var[$i][1],$Update & "" & $file[6],1,1)
Do
Sleep(250)
Until InetGetInfo($down,2)
InetClose($down)
Next
EndIf
EndFunc
4.4 一键修复
使用_FileListToArray()函数从Update目录下逐一读取补丁文件,使用RunWait()函数实现补丁一键修复。
Func _OneKeyFixed()
Dim $filelist[1]
$filelist = _FileListToArray($Update,"*.exe",1)
If IsArray($filelist)= 0 Then
_Exit()
Else
For $j = 1 To $filelist[0]
$result = RunWait(@ScriptDir & "Update" & $filelist[$j] & " /u /z /n /o /q");
Next
EndIf
EndFunc
5 结论
5.1 使用后效果
工具实现了厂内网安装WinXP、Win2003操作系统的终端计算机自动快速的系统补丁更新需要。
5.2 结语
作为一名基层系统运维人员,完全依赖于网络上提供的免费工具,进行系统清理与优化、系统恢复或打补丁等这些日常工作,可能会给计算机带来潜在安全风险威胁,也可能会影响到内网已部署的安全工具的正常使用。因此,自主开发一些实用系统运维工具,是有实际意义的。AU3作为一种小众语言,它功能强大,易于快速开发出众多实用系统运维工具,非常适合从事系统与网络管理人员来学习,在此抛砖引玉,希望能吸引更多的人来关注和学习AU3语言,为不断提高系统运维水平和帮助用户轻松、简单的管理自己的计算机作出贡献。
[1]“科普中国”科学百科词条编写与应用工作项目.系统漏洞[OL].https://baike.baidu.com,2018-02-12.
[2]AutoIt快速开发指南[EB].https://www.autoitx.com,2019-07-01.
[3]邹国奎.基于AutoIt开发的局域网系统补丁更新应用[J].硅谷,2012(03):14.