Windows Server常常須要安裝安全補丁,wsus安裝補丁的策略,尤爲在重啓服務器這塊,不知足需求,人工逐檯安裝又須要大量的時間。所以部署一臺控制機,經過運行PowerShell腳本遠程批量安裝Windows補丁,能夠極大的提高工做效率。shell
批量安裝Windows server補丁。windows
Microsoft定義了一個 WS-Management 的協議,這個協議爲計算機設備遠程交換管理數據提供了一個公開的標準。在 Windows 平臺上,MS 經過 Windows 遠程管理服務(Windows Remote Management service,簡稱 WinRM) 實現了 WS-Management 協議。這就是咱們能夠經過 PowerShell 執行遠程操做的基礎,由於 PowerShell 就是經過 WinRM 服務來進行遠程操做的。安全
但實際測試中,當咱們使用以下命令遠程安裝時候,卻老是安裝失敗。服務器
Invoke-Command -ComputerName $Computer -ScriptBlock { wusa.exe xxx.msu /quiet /norestart}
經過日誌能夠看到,報錯以下: 沒法安裝 Windows 更新 ,由於發生錯誤: 2147942405「拒絕訪問。「ide
原來,微軟不支持使用wusa和其API遠程安裝補丁更新,解決方案是使用dism或者add-windowspackage代替。測試
批量安裝主要三步:spa
第一步: 拷貝文件rest
下載補丁文件(.msu),拷貝到控制機對應目錄(如c:\fix),經過腳本將其解壓(加壓後便於dism或者add-windowspackage安裝)並拷貝到目標機。日誌
"computer_list.txt" 用戶存儲目標機器名稱,每行一個。這個文件是惟二須要管理員手工編輯的(另外一個就是下載補丁拷貝到控制機)。
本步: 右擊,使用powershell運行"copy.ps1"
#Script_name:copy.ps1 $PC = Get-Content("C:\scripts_wusa\computer_list.txt") $FileMSU = Get-ChildItem C:\fix -Name $CAB_PATH = "C:\fix_cab\" wusa.exe "C:\fix\$FileMSU" /extract:$CAB_PATH #解壓過程休息90s Start-Sleep -Seconds 90 $i = 0 foreach ($h in $PC){ $i++ Copy-Item -Path $CAB_PATH -Destination \\$h\C$\ -Recurse -Force if ($h -eq $PC[-1]){ Write-Progress -Activity "進度顯示" -status "正在處理最後一臺主機 $h !" Write-Output "總計處理 $i 臺主機,傳輸完畢!" #Start-Sleep -Seconds 20 pause } else{ Write-Progress -Activity "進度顯示" -status "正在處理 第 $i 臺主機 $h ,請耐心等待!" -PercentComplete ($i/$PC.count*100) } }
第二步: 運行遠程安裝腳本
這個步驟共2個腳本,一個腳本用來執行安裝動做,另外一個腳本用來調用第一個,執行遠程操做。
本步: 右擊,使用powershell運行 "Remote_install.ps1"
要注意的是: 域內計算機,域管理員登錄控制機後,遠程操做時不用在進行認證。域外計算機,必需要經過參數 -Credential 提供遠程操做管理憑據認證。
安裝腳本:
#Script_name:action_fix.ps1 $FileCAB = Get-ChildItem C:\fix_cab *KB*.cab -Name Foreach ($file in $FileCAB) { Add-WindowsPackage -Online -PackagePath C:\fix_cab\$file -NoRestart }
遠程調用:
#Script_name:Remote_install.ps1 $PC = Get-Content("C:\scripts_wusa\computer_list.txt") $i=0 foreach ($h in $PC){ $i++ #域內計算機 Invoke-Command -ComputerName $h -FilePath C:\scripts_wusa\action_fix.ps1 #未加域計算機 #Invoke-Command -ComputerName $h -FilePath C:\action_fix.ps1 -Credential administrator Write-Progress -Activity "安裝進度" -Status "正在爲主機 $h 安裝補丁,請耐心等待!" -PercentComplete ($i/$PC.Count*100) }
第三步: 遠程安裝結果驗證
這個步驟也2個腳本,一個腳本用來執行檢查動做,另外一個腳本用來調用第一個,執行遠程操做。
本步: 右擊,使用powershell運行 "check_fix_install.ps1"
檢查安裝結果:
#Script_name:check_show $FileCAB = Get-ChildItem C:\fix_cab *KB*.cab -Name Function Get_fix() { foreach ($i in $FileCAB){ $KB = $i.Split("-")[1] Get-hotfix | where {$_.HotFixID -eq $KB } } } Get_fix
遠程調用:
#Script_name:check_fix_install.ps1 $PCs = Get-Content("C:\scripts_wusa\computer_list.txt") foreach ($h in $PCs) { $result = Invoke-Command -ComputerName $h -FilePath C:\scripts_wusa\get_fix.ps1 if ($result){ Write-Output "$h install Sucess!" } else{ Write-Output "$h install Failure!" } } pause
看一下第三步的運行結果(能夠只打印安裝失敗的主機,畢竟咱們更關心安裝失敗的):
補丁安裝成功後,剩下的就是管理員選擇合理的時間,將服務器重啓就能夠了,也能夠經過婆powershell 遠程批量重啓。【Restart-Computer -ComputerName pc-1,pc-2,pc-N -Force】