您好,登錄后才能下訂單哦!
Windows Server經(jīng)常需要安裝安全補(bǔ)丁,wsus安裝補(bǔ)丁的策略,尤其在重啟服務(wù)器這塊,不滿足需求,人工逐臺(tái)安裝又需要大量的時(shí)間。因此部署一臺(tái)控制機(jī),通過運(yùn)行PowerShell腳本遠(yuǎn)程批量安裝Windows補(bǔ)丁,可以極大的提升工作效率。
批量安裝Windows server補(bǔ)丁。
Microsoft定義了一個(gè) WS-Management 的協(xié)議,這個(gè)協(xié)議為計(jì)算機(jī)設(shè)備遠(yuǎn)程交換管理數(shù)據(jù)提供了一個(gè)公開的標(biāo)準(zhǔn)。在 Windows 平臺(tái)上,MS 通過 Windows 遠(yuǎn)程管理服務(wù)(Windows Remote Management service,簡(jiǎn)稱 WinRM) 實(shí)現(xiàn)了 WS-Management 協(xié)議。這就是我們可以通過 PowerShell 執(zhí)行遠(yuǎn)程操作的基礎(chǔ),因?yàn)?PowerShell 就是通過 WinRM 服務(wù)來進(jìn)行遠(yuǎn)程操作的。
但實(shí)際測(cè)試中,當(dāng)我們使用如下命令遠(yuǎn)程安裝時(shí)候,卻總是安裝失敗。
Invoke-Command -ComputerName $Computer -ScriptBlock { wusa.exe xxx.msu /quiet /norestart}
通過日志可以看到,報(bào)錯(cuò)如下: 無法安裝 Windows 更新 ,因?yàn)榘l(fā)生錯(cuò)誤: 2147942405“拒絕訪問?!?/p>
原來,微軟不支持使用wusa和其API遠(yuǎn)程安裝補(bǔ)丁更新,解決方案是使用dism或者add-windowspackage代替。
https://support.microsoft.com/en-us/help/2773898/windows-update-standalone-installer-wusa-returns-0x5-error-access-deni
批量安裝主要三步:
第一步: 拷貝文件
下載補(bǔ)丁文件(.msu),拷貝到控制機(jī)對(duì)應(yīng)目錄(如c:\fix),通過腳本將其解壓(加壓后便于dism或者add-windowspackage安裝)并拷貝到目標(biāo)機(jī)。
"computer_list.txt" 用戶存儲(chǔ)目標(biāo)機(jī)器名稱,每行一個(gè)。這個(gè)文件是唯二需要管理員手工編輯的(另一個(gè)就是下載補(bǔ)丁拷貝到控制機(jī))。
本步: 右擊,使用powershell運(yùn)行"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 "進(jìn)度顯示" -status "正在處理最后一臺(tái)主機(jī) $h !"
Write-Output "總計(jì)處理 $i 臺(tái)主機(jī),傳輸完畢!"
#Start-Sleep -Seconds 20
pause
}
else{
Write-Progress -Activity "進(jìn)度顯示" -status "正在處理 第 $i 臺(tái)主機(jī) $h ,請(qǐng)耐心等待!" -PercentComplete ($i/$PC.count*100)
}
}
第二步: 運(yùn)行遠(yuǎn)程安裝腳本
這個(gè)步驟共2個(gè)腳本,一個(gè)腳本用來執(zhí)行安裝動(dòng)作,另一個(gè)腳本用來調(diào)用第一個(gè),執(zhí)行遠(yuǎn)程操作。
本步: 右擊,使用powershell運(yùn)行 "Remote_install.ps1"
要注意的是: 域內(nèi)計(jì)算機(jī),域管理員登陸控制機(jī)后,遠(yuǎn)程操作時(shí)不用在進(jìn)行認(rèn)證。域外計(jì)算機(jī),必須要通過參數(shù) -Credential 提供遠(yuǎn)程操作管理憑據(jù)認(rèn)證。
安裝腳本:
#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
}
遠(yuǎn)程調(diào)用:
#Script_name:Remote_install.ps1
$PC = Get-Content("C:\scripts_wusa\computer_list.txt")
$i=0
foreach ($h in $PC){
$i++
#域內(nèi)計(jì)算機(jī)
Invoke-Command -ComputerName $h -FilePath C:\scripts_wusa\action_fix.ps1
#未加域計(jì)算機(jī)
#Invoke-Command -ComputerName $h -FilePath C:\action_fix.ps1 -Credential administrator
Write-Progress -Activity "安裝進(jìn)度" -Status "正在為主機(jī) $h 安裝補(bǔ)丁,請(qǐng)耐心等待!" -PercentComplete ($i/$PC.Count*100)
}
第三步: 遠(yuǎn)程安裝結(jié)果驗(yàn)證
這個(gè)步驟也2個(gè)腳本,一個(gè)腳本用來執(zhí)行檢查動(dòng)作,另一個(gè)腳本用來調(diào)用第一個(gè),執(zhí)行遠(yuǎn)程操作。
本步: 右擊,使用powershell運(yùn)行 "check_fix_install.ps1"
檢查安裝結(jié)果:
#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
遠(yuǎn)程調(diào)用:
#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
看一下第三步的運(yùn)行結(jié)果(可以只打印安裝失敗的主機(jī),畢竟我們更關(guān)心安裝失敗的):
補(bǔ)丁安裝成功后,剩下的就是管理員選擇合理的時(shí)間,將服務(wù)器重啟就可以了,也可以通過婆powershell 遠(yuǎn)程批量重啟?!綬estart-Computer -ComputerName pc-1,pc-2,pc-N -Force】
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。