最近一直在琢磨一件事情,想實現服務器(包括宿主機、虛擬機)的補丁自動更新,能在指定的點進行補丁更新,更新須要重啓還須要能夠在指定的時間窗重啓,最好還能監控重啓狀態,還有若是是Hyper-v宿主機,最好能先保存虛擬機,或者最好能確保把Hyper-v羣集中的高可用虛擬機在線遷移到其餘機器上再重啓,由於通常服務器有SCOM監控,所以在更新補丁以前最好能置於維護狀態,更新成功後再取消維護狀態,顯然這樣的要求只是用WSUS自己沒有辦法完成這個目標。windows
我測試了windows server 2012 下的羣集感知更新(cluster aware update),也還算好用吧,可是這個只是針對羣集的,並且只能是windows server 2012 系統或者之後OS上的羣集,另外這個只能把羣集節點置於維護狀態,不能在SCOM中置於維護狀態。安全
我後面經過這些連接服務器
http://gallery.technet.microsoft.com/scriptcenter/Automating-UpdatePatch-136388b1app
也瞭解到SCVMM能夠對基礎架構中的物理服務器進行補丁更新,可是SCVMM中的更新基線示例默認是空的,必須往更新基線中手動添加所須要的更新,這一點有點麻煩,我通常在WSUS中自動審批一些安全更新和重要補丁,而後手動審批一部分必須更新,SCVMM中應當同步審批的補丁到更新基線就行了,能夠複用以前WSUS中的工做成果。ide
所以我須要找尋一個方法可以自動更新已經審批的補丁到更新基線中,我搜索了下互聯網,找到這篇blog測試
他的腳本給我提供了一個想法和思路,所以我開始以此爲起點,來寫個適合我本身的腳本。spa
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基礎結構主機。