溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Powershell批量安裝Windows服務(wù)器補(bǔ)丁

發(fā)布時(shí)間:2020-09-17 20:46:58 來源:網(wǎng)絡(luò) 閱讀:1692 作者:marbury 欄目:系統(tǒng)運(yùn)維

場(chǎng)景

Windows Server經(jīng)常需要安裝安全補(bǔ)丁,wsus安裝補(bǔ)丁的策略,尤其在重啟服務(wù)器這塊,不滿足需求,人工逐臺(tái)安裝又需要大量的時(shí)間。因此部署一臺(tái)控制機(jī),通過運(yùn)行PowerShell腳本遠(yuǎn)程批量安裝Windows補(bǔ)丁,可以極大的提升工作效率。

目標(biāo)

批量安裝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

實(shí)現(xiàn)

批量安裝主要三步:

  • 拷貝補(bǔ)丁文件【下載補(bǔ)丁->控制機(jī)->目標(biāo)機(jī)】
  • 遠(yuǎn)程安裝補(bǔ)丁文件
  • 驗(yàn)證安裝結(jié)果

第一步: 拷貝文件

下載補(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)心安裝失敗的):

Powershell批量安裝Windows服務(wù)器補(bǔ)丁

補(bǔ)丁安裝成功后,剩下的就是管理員選擇合理的時(shí)間,將服務(wù)器重啟就可以了,也可以通過婆powershell 遠(yuǎn)程批量重啟?!綬estart-Computer -ComputerName pc-1,pc-2,pc-N -Force】

向AI問一下細(xì)節(jié)

免責(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)容。

AI