利用WMI实现系统补丁检测分析

所属分类: 脚本专栏 / vbs 阅读数: 1724
收藏 0 赞 0 分享

WMI是Windows 2000/XP管理系统的核心;对于其它的Win32操作系统,WMI是一个有用的插件。WMI以CIMOM为基础,CIMOM即公共信息模型对象管理器 (Common Information Model Object Manager),是一个描述操作系统构成单元的对象数据库,为MMC和脚本程序提供了一个访问操作系统构成单元的公共接口。Windows 管理规范 (WMI) 是可伸缩的系统管理结构,它采用一个统一的、基于标准的、可扩展的面向对象接口。我在刚开始理解WMI的时候,总以为WMI是“Windows管理接口(Interface)”。

      下面我们就详细来了解如何利用WMI实现补丁的检测过程。图1是整个检测过程的流程图。

1.利用WMI实现补丁检测之流程图

       第一步,设置需要检测的补丁号。我们知道,微软的每个补丁都会有一个标准的编号(如KB828741),对于最新的补丁,我们可以从微软的网站上获得。然后,将希望用户安装的补丁号放到一个数组里。根据不同Windows操作系统我们需要设置不同检测补丁号。基于当前Windows系统使用情况,我只对Windows 2000/2003/XP进行检测。
图1.利用WMI实现补丁检测之流程图
第一步,设置需要检测的补丁号。我们知道,微软的每个补丁都会有一个标准的编号(如KB828741),对于最新的补丁,我们可以从微软的网站上获得。然后,将希望用户安装的补丁号放到一个数组里。根据不同Windows操作系统我们需要设置不同检测补丁号。基于当前Windows系统使用情况,我只对Windows 2000/2003/XP进行检测。
‘ 对于windows 2000
arrFixed_WIN2K=Array("KB840315","KB870669","KB828741","KB835732",
"KB840987","KB841356","KB885835","KB885836",
"KB842526","KB841872","KB841873","KB889293")
'对windows 2003系统
arrFixed_WIN2K3=Array("KB834707","KB840374","KB867801","KB833987",
"KB873376","KB885835","KB885836")
'对于windows xp SP1
arrFixed_XP1=Array("KB840987","KB833987","KB839645","KB840315","KB841873","
KB873376","KB841356","KB889293","KB885835","KB885836")
'对于windows xp SP2
arrFixed_XP2=Array("KB834707","KB885835","KB885836")
第二步,创建WMI对象,并和目标主机建立连接。
Dim objWMIService // WMI对象
Dim strComputer = “.” // 地址为当前主机
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
首先,定义两个变量objWMIService和strComputer,第一个为我们要创建的服务定位对象,第二个为目标主机IP地址(如果为当前主机者为“.”)。第三句创建一个连接到目标主机的服务对象,定义名字空间参数为“root\cimv2”。在这个名字空间里有我们接下来要用的系统信息。
Socket:详细代码请看光盘附送的Check_patch.txt,更改文件扩展名txt为VBS,在Windows下可双击运行,如果当前系统检测出未打补丁,则出现提示窗口,否则无。
第三步,读取当前用户操作系统信息,及其安装补丁的情况。在名字空间“root/cimv2”下,实例“Win32_OperatingSystem”为我们提供了详细的当前操作系统信息。我们采用Wql(sql for WMI)来读取该实例,熟悉SQL语法的朋友一看就知道是在做什么了。
' 先判断主机系统信息:OS,SP补丁版本情况
' 获取系统信息
Dim objOSInfo // 获取操作系统信息
Dim intOSver,intOStype,intCurrentSP // 当前系统版本,类型,Service Pack号
Set objOSInfo = osvcRemote.ExecQuery("Select ServicePackMajorVersion,Version,OSType FROM Win32_OperatingSystem")
For Each colOSInfo In objOSInfo
intCurrentSP = colOSInfo.ServicePackMajorVersion ‘sp安全补丁版本
intOSver = colOSInfo.Version ‘操作系统版本号
intOStype = colOSInfo.OSType ‘操作系统类型
Next
Socket:如何知道要连接哪个名字空间,获得哪些对象呢?《WMI技术指南》[3]中分类列出了大量常用的对象。可惜它没有相应的电子书,你只有到书店里找它了。你也可以用WMITools里WMI CIM Studio这个工具的搜索功能,很容易就能找想要的对象。找到对象后,WMI CIM Studio能列出其属性和方法,然后到MSDN里找具体的帮助。
第四步,获取当前系统已经安装的补丁信息。在“root\cimv2”下,实例“Win32_QuickFixEngineering”下的“HotFixID”属性存放了当前系统所安装的补丁信息。
'*******************************************************************
'*读取目标主机已安装补丁列表到字符串strFixedList
'*******************************************************************
Dim colQFE, objQFE
Dim strHotFixID, strFixedList, strFind, strNoFixed
Set colQFE = osvcRemote.ExecQuery("SELECT HotFixID FROM Win32_QuickFixEngineering")
第四步,将读取的用户补丁号存到一数组变量,然后与我们在“第一步“定义的相应数组进行匹配,找出当前系统未安装的补丁号。这部分的实现比较简单,请参考后面的代码。
第五步,显示最后检测结果。
至此,整个补丁检测过程结束,只要将本脚本文件进行点击运行,就可以完成补丁的检查。特别是对于已经在企业中建立起Acitve Directory域的网络管理员来说,只要将此脚本添加到域控制器的组策略里,对每个登陆到域的用户进行补丁检测,提示用户最新补丁信息,再也不用为用户没有安装最新补丁而苦恼了,大大提高了企业内部网络安全管理。

更多精彩内容其他人还在看

vbscript Split函数用法详解(字符串转数组函数)

本文详细介绍了vbscript中split函数的用法,有关split函数的一些实例,vbscript中split函数的语法介绍,有需要的朋友参考下
收藏 0 赞 0 分享

VBS实现将Excel表格保存为txt文本

希望能够找到个能给excel表另存为TXT的VBS代码,虽然另存为可以选择,但还是需要直接VBS执行这一步另存为TXT格式的,应该如何写代码呢
收藏 0 赞 0 分享

vbs解决处理TXT文本数据相关问题实现代码

使用vbs处理txt数据时,会遇到一些问题,本文将提供详细的解决方法,希望可以帮助你们
收藏 0 赞 0 分享

关于vbs 生成静态页面过程中出现的问题

访问某个aspx页面,然后把服务器返回的页面以filestream 的形式保存为html格式,接下来将介绍实现代码
收藏 0 赞 0 分享

dim函数第三个参数设置截取字符的长度问题

dim函数的第三个参数,也就是截取字符的长度,我在设置这个的时候,出了些问题,提示无效的过程调用或参数,本文详细介绍如何解决
收藏 0 赞 0 分享

邪恶的eval和new Function使用介绍

这些代码可以干什么?可以肯定的是可以干很多猥琐的事
收藏 0 赞 0 分享

WScript.Shell对象SpecialFolders属性未公开文档分享

WshShell对象的SpecialFolders属性返WshSpecialFolders 对象,该对象是一个特殊文件夹集合,其中包含整套Windows特殊文件夹
收藏 0 赞 0 分享

用VBS修改(设置)系统时间和日期的代码

用 VBS 把系统的时间修改到2038年1月19日3时14分07秒之后,这样某些依赖于 Unix 时间戳的程序就会出问题。那么怎样用 VBS 修改系统的时间呢
收藏 0 赞 0 分享

VBS For Next循环的一些细节

For Next 语句是 VBS 中常用的循环语句,你可能已经用过无数次 For Next 循环,但是你是否注意过它的一些细节呢
收藏 0 赞 0 分享

VBS For Next循环的陷阱分享

在《VBS For Next循环的一些细节》中说到了 For Next 循环的控制变量仅仅在循环开始前求值一次,但是其中存在一处陷阱
收藏 0 赞 0 分享
查看更多