需要重启还需要可以在指定的时间窗重启,最好还能监控重启状态,还有如果是Hyper-v宿主机,最好能先保存虚拟机,或者最好能确保把Hyper-v群集中的高可用虚拟机在线迁移到其他机器上再重启,因为一般服务器有SCOM监控,因此在更新补丁之前最好能置于维护状态,更新成功后再取消维护状态,显然这样的要求只是用WSUS本身没有办法完成这个目标。
我测试了windows server 2012 下的群集感知更新(cluster aware update),也还算好用吧,但是这个只是针对群集的,而且只能是windows server 2012 系统或者以后OS上的群集,另外这个只能把群集节点置于维护状态,不能在SCOM中置于维护状态。
我后面通过这些链接
http://gallery.technet.microsoft.com/scriptcenter/Automating-UpdatePatch-136388b1
也了解到SCVMM可以对基础架构中的物理服务器进行补丁更新,但是SCVMM中的更新基线示例默认是空的,必须往更新基线中手动添加所需要的更新,这一点有点麻烦,我一般在WSUS中自动审批一些安全更新和重要补丁,然后手动审批一部分必须更新,SCVMM中应当同步审批的补丁到更新基线就好了,可以复用之前WSUS中的工作成果。
因此我需要找寻一个方法能够自动更新已经审批的补丁到更新基线中,我搜索了下互联网,找到这篇blog
他的脚本给我提供了一个想法和思路,因此我开始以此为起点,来写个适合我自己的脚本。
- 首先我需要找到一个方法来过滤出我需要的补丁更新(已经审批过的、适合windows server 2008及R2 到windows server 2012 及R2的新的前200?个补丁)
- 使用compare-object 来对比是否基线中已包含了第一步中过滤出的补丁列表。原作者使用if then ,代码不够简洁。
- 增加其他还没有想好的内容。
OK,我看到之前脚本作者使用Get-SCUpdate来获取和过滤更新,我需要知道get-scupdate 可以使用哪些参数
仅有上面参数是否无法满足我的过滤需求,我得看看get-scupdate 返回的对象含有哪些属性,这样我们使用where 进行过滤。我看到很多IS开头的属性,以及products,UpdateType,updateClassification等参数可以使用。
下面的过滤是我需要的结果。
下面是我自己的脚本:
Import-Module virtualmachinemanager
$jobGuid=[System.guid]::newGuid().tostring()
$myBaselineName="New_Approved_Updates_For_Server_08_And_12"
$newupdates=Get-SCUpdate|?{$_.products -match 'Windows server 20(08|12)' -and $_.isapproved}|sort -Property ArrivalDate -desc|select -first 500
$Mybaseline=get-SCBaseline|?{$_.Name -eq $myBaselineName}
if(!$myBaseLine){
$mybaseline=new-scbaseline -name $myBaselineName
}
if($myBaseLine){
$currentUpdates=(get-SCBaseline -Name $myBaselineName).updates
$UpdatesNeedToAdd=Compare-Object $newupdates $currentUpdates|?{$_.sideindicator -eq "<="}|%{$_.inputobject}
Set-SCBaseline -Baseline $mybaseline -RunAsynchronously -AddUpdates $UpdatesNeedToAdd -JobGroup $jobGuid -StartNow
}
Ok ,使用了以上SCVMM的更新基线,更新基线符合性扫描,更新基线符合性修复之后,发现此种更新方式也存在一定的局限性,SCVMM 中只能配置一个WSUS服务器,如果你的SCVMM管理了多个网络,而且使用了不止一台WSUS,这个时候SCVMM无法使用更新基线来扫描和修复位于其他网络(但存在下游或者其他WSUS)上Hyper-v基础结构主机。
本文转自 yoke88 51CTO博客,原文链接:http://blog.51cto.com/yoke88/1324432