让系统通过域用户自动打补丁

Windows操作系统的安全问题越来越受到人们的关注 , 每隔一段时间 , 微软就会发布修复系统漏洞的补丁 。但是 , 由于很多用户不能及时使用这些补丁加固系统 , 因此往往造成重大损失 , 所以及时打补丁非常重要 。然而 , 现在局域网的规模越来越大 , 对网络治理员来说 , 手工为每台客户机安装补丁的工作量实在太大 , 很难及时完成 。

选择解决方式

网络治理员除了手工为每台客户机安装补丁外 , 还可以采用以下几种方式来解决这个复杂问题:

1. 在企业的局域网中架设微软提供的免费软件升级服务器(Software Update Services , SUS) , 安排客户机定期自动执行升级 , 但是碰到紧急情况会出现某些电脑被漏掉的情况 。

2. 使用微软Systems Management Services中补丁分发功能 , SMS非常强大 , 不过它可不是免费的 。

3. 采用第三方的治理软件如:IBM的Tivoli与LANDesk的Management Suite等 。

简单、方便、快捷、免费是我们治理员追求的最高境界了 , 我提供的通过域用户脚本自动打补丁的方法大概就能符合上面的要求了 。

脚本登录需知

不过在使用登录脚本之前我们需要了解下面两个问题:

1. 如何避免每安装完一个补丁就重启

Hotfix文件具有多个可选参数 。重要的有-z表示安装后不重新启动计算机 , -m表示安装过程中不出现提示信息 , -q表示安装过程中不出现提示信息 。我们下面的脚本可以使用到-m和-q两个 。

如何将多个补丁文件串联起来?我们就要用到微软提供的Qchain.exe程序 。Qchain.exe的使用非常简单 , 语法是Qchain [logfilename] , Logfilename表示日志文件名 , 它记载了多个补丁安装前后的注册表中未决文件重命名队列键值的对比 。实际上 , Qchain.exe的功能就是检查注册表的未决文件重命名队列键值 , 对多个Hotfixes的安装文件进行合适的链接和取舍操作 , 最终保证被修改文件是最新版本 。(详情与下载参见http://support.microsoft.com/kb/815062)

2. 如何判定用户已经安装了哪些补丁

微软提供的补丁都有一个“KB”号 , 这是为了方便用户查询详情的代码 , 比如KB823980(“冲击波”的漏洞) , 就可以通过http://support.microsoft.com/?id=823980查到具体说明 。我们也知道当安装完毕一个补丁的时候会在系统目录(%SystemRoot%)中存放同样名称的Log文件 。从以上两方面我们就可以利用系统目录中是否有KB823980.log文件判定补丁安装与否 。

创建脚本

好了 , 万事俱备 , 只欠东风!我们赶紧做个脚本吧 。

1. 在Server上建立Hotfix目录将要安装的补丁和Qchain.exe放到此目录下 。同时我觉得按照微软的“KB”号将补丁的改名排列好 , 如图1所示 。



图1 补丁文件列表

2. 设置Hotfix文件夹的访问权限 , 设置Administrators为完全控制 , Authenticated users为读取权限 , 如图2所示 。



图2设置Hotfix文件夹的访问权限

3. 在C:WinntSysvolSysvolDomain_nameScripts下建立Hotfix.bat脚本 。请将本文中Domain_name更改为各位网管员自己治理的服务器名称 。

脚本内容如下:

@echo off

echo 正在检测Windows2000 Update Server,请稍后......

IF not EXIST C:Winnt GOTO END

net use Z: Server_nameHotfix

Z:

IF EXIST %SystemRoot%KB823980.log ECHO 恭喜您!已经安装了KB823980号补丁 , 进行下一项检查......

IF not EXIST %SystemRoot%KB823980.log echo很遗憾!没有安装KB823980号补丁 , 现在正在安装 , 请稍候......

IF not EXIST %SystemRoot%KB823980.log KB823980.exe -z -q

IF EXIST %SystemRoot%KB823182.log ECHO恭喜您!已经安装了KB823182号补丁 ,

推荐阅读