这篇文章是回忆某年5月1日加班的情景,当时虽然有自己的sus和sms,但如果需要立杆见影,立刻用来分发hotfix或者sp等等。却很麻烦,于是当时就考虑用组策略计算机启动脚本的方法来做。下面就是回忆当时的过程。

其实,hotfix之类的可执行文件是可以放在计算机启动脚本的位置直接执行的。计算机启动的时候,还没有用户验证登录,此时只存在于计算机账户。故而这个时候的权限比较特殊。无论是脚本还是可执行文件,需要管理员权限执行的都可以放在这里来做。

当时的考虑是先用vbs脚本杀掉病毒进程,然后安装kb835732,自动重新启动后OK!
在实践的时候,遇到一个问题破费思量,就是无论在vbs,还是cmd中,尝试使用/q(/quiet)的静态安装模式(关于hotfix安装参数的获取办法在后边附上),但此参数不能传递,导致用户在登陆的时候仍然要一步一步点击,不但麻烦而且不雅观:)

在和Winmag的winback老姚讨论的时候,尝试了在共享目录上添加计算机账户、把kb放到第三方的fileserver上等也无法成功,但此参数在本地执行是完全有效的。您看到的文章源自活动目录seo http://gnaw0725.blog.51cto.com/156601/d-1

后来,经过尝试发现,无论是把hotfix放在策略的默认脚本执行位置,还是放在netlogon,还是放在fileserver的sharefolder下,都需要在脚本中指定hotfix存放的绝对路径。解决这个问题之后,后面的问题就好办了:)

那么按照一般的规范,我将策略放置在部门ou下面的policies ou上,然后将策略link到部门ou上。这样做的目的是便于策略的集中管理。

然后在计算机登陆脚本的位置(计算机配置-windows设置-脚本启动/关闭-启动),放置cmd调用vbs,然后调用hotfix执行安装kb835732。

如果是放在策略默认的脚本位置,那么脚本名字前面就不用加路径了,否则应该是这样servername(ip) etlogonscriptname

当时由于急于使用,没有做进一步调整,直接用cmd调用了vbs和hotfix,cmd的内容大致是这样了

remove.vbs 这里之所以没有指定wscript还是cscript是因为在实际运行中,常常碰到要么前者,要么后者无法关联vbs文件的情况,还是让系统自己决定。

domainname\SysVol\domainname\Policies\GUID\Machine\Scripts\Startup\kb835732.exe /Q  注意这里必须指定绝对路径,否则无法传递/q的参数。

remove.vbs的内容如下:
On Error Resume Next
const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Kill Virus Process
strProcsToKill = "avserve2.exe"
Set wbemObjectSet = GetObject("winmgmts:" & "{impersonationLevel=impersonate," & "authenticationLevel=Pkt}" & strComputer & " ootcimv2").InstancesOf("Win32_Process")
For Each wbemObject In wbemObjectSet
If LCase(wbemObject.Name)=strProcsToKill Then wbemObject.Terminate
Next
Remove Virus Registry Values
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!" &strComputer & " ootdefault:StdRegProv")
strKeyPath = "SOFTWAREMicrosoftWindowsCurrentVersionRun"
strDWORDValueName = "avserve2.exe"
oReg.DeleteValue HKEY_LOCAL_MACHINE,strKeyPath,strDWORDValueName
Remove Virus File
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile("%systemroot%avserve2.exe")
objFSO.DeleteFile("%systemroot%system32*_up*.*")
 

这个脚本仍然不是很严谨,对于随机产生的*_up还无法kill。其实,随后的kb835732,也可以放到vbs脚本中来执行,使用如下的办法就可以获得执行了,不过仍然要注意使用绝对路径。您看到的文章源自活动目录seo http://gnaw0725.blog.51cto.com/156601/d-1

set ws=wscript.createobject("wscript.shell")
ws.run "cmd /k \\server\sharename\kb835732.exe",0

在这里可以获得移除Sasser Virus更为完善的脚本http://cwashington.netreach.net/downloads/scripts/vbscript/clean_sasser_virus.zip

关于hotfix在client端安装完成后是否重新启动,可以让它自己决定,也可以使用参数强制重新启动或者不启动。如果有多个hotfix,也可以
“使用 QChain.exe 将修补程序安全地链接到一起。修补程序链接可以连续安装多个修补程序,中间不需要重新启动。”

这个工具在这里下载
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=A85C9CFA-E84C-4723-9C28-F66859060F5D

这样,如果正常情况下,client在下次重新启动机器,再次登陆的时候将会接受到这一策略,hotfix将会在后台静态执行。如果原来安装过,hotfix将会在解压后使用update.exe检测系统是否已经安装过,如果安装过就直接退出,并清除解压产生的临时文件(一般都是在根目下产生一个以一长串随机数字为目录名的目录)。当然大家也可以在vbs中就检测hotfix是否安装,而跳过这个解压的过程,以避免产生不必要的网络流量。

关于hotfix的安装参数,可以在kb835732.exe后面带/help的参数来获取,系统在解压完成后,将会给出下面这个画面
可爱的Sasser,可爱的MS04-011,可爱的KB835732,可爱的5月1日:)

组策略补丁分发的相关文章请参考
组策略软件分发|WMI筛选
组策略软件分发|wmi筛选释疑
组策略补丁分发
组策略分发Office|自动输入序列号

组策略软件分发|故障排查方法
组策略软件分发权限
---gnaw0725