批量安装Windows服务器补丁

场景

Windows Server经常需要安装安全补丁,wsus安装补丁的策略,尤其在重启服务器这块,不满足需求,人工逐台安装又需要大量的时间。因此部署一台控制机,通过运行PowerShell脚本远程批量安装Windows补丁,可以极大的提升工作效率。

目标

批量安装Windows server补丁。

引言

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“拒绝访问。“

原来,微软不支持使用wusa和其API远程安装补丁更新,解决方案是使用dism代替。

https://support.microsoft.com/en-us/help/2773898/windows-update-standalone-installer-wusa-returns-0x5-error-access-deni

实现

批量安装主要三步:

  • 拷贝补丁文件【下载补丁->控制机->目标机】
  • 远程安装补丁文件
  • 验证安装结果

第一步: 拷贝文件

下载补丁文件(.msu),拷贝到控制机对应目录(如c:\fix),通过脚本将其解压(加压后便于dism安装)并拷贝到目标机。

"computer_list.txt" 用户存储目标机器名称,每行一个。这个文件是唯二需要管理员手工编辑的(另一个就是下载补丁拷贝到控制机)。

#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个脚本,一个脚本用来执行安装动作,另一个脚本用来调用第一个,执行远程操作。

要注意的是: 域内计算机,域管理员登陆控制机后,远程操作时不用在进行认证。域外计算机,必须要通过参数 -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个脚本,一个脚本用来执行检查动作,另一个脚本用来调用第一个,执行远程操作。

检查安装结果:

#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!"
    }

}

看一下第三步的运行结果(可以只打印安装失败的主机,毕竟我们更关心安装失败的):

补丁安装成功后,剩下的就是管理员选择合理的时间,将服务器重启就可以了,也可以通过婆powershell 远程批量重启。【Restart-Computer -ComputerName pc-1,pc-2,pc-N -Force】

原文地址:https://blog.51cto.com/magic3/2447210

时间: 2024-10-08 19:26:01

批量安装Windows服务器补丁的相关文章

[网络克隆]利用tiny proxy实现局域网内批量安装WINDOWS操作系统。

说明:本文支持UEFI及BIOS系统克隆.支持UEFI及BIOS网络引导,适用于新旧几乎所有支持网络启动的电脑. 事前准备: 保证被克隆的电脑为同一配置,或者各硬件差异不大,比如CPU同如英特尔8代的,I5和I7,也是可以正常同传的.若被克隆机配置参差不齐,推荐下载纯净版GHOST镜像进行批量克隆. 保证所有电脑均处于同一局域网下.所有电脑均为千兆网络为最佳,百兆也可以,但是速度会很慢. 若某一台,或者几台共用一个百兆傻瓜,请把它们单独安装.这个对网络克隆速度影响非常大. 一.创建镜像 从众多电

Windows Server 2008 R2使用WDS服务实现批量安装操作系统演示

昨天在51cto朋友圈看到有关WDS部署的演示,我参考上面的一步步来,发现诸多的问题的,其中在如何捕获封装好的windows server 2003时候遇到过一个问题,那就是制作winpe的启动镜像时候,我把它添加到安装镜像里头,发现添加始终报错,后来准备写一篇有关这方面的技术参考博文,发现想明白了,第二点就是在添加网卡驱动的时候,如果驱动程序包未经微软Windows实验室(WHQL)认证的签名是无法被安装的,这是棘手的问题,我相信任何问题都是有解决的办法的,只是时间问题,如果这个问题不能解决,

在Windows下安装Tomcat服务器

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选服务器. 在Windows下安装Tomcat服务器的方式有两种,一种是直接安装,一种是绿色版,解压后就可以直接使用的 这篇博客为大家介绍第二种方式 首先从http://download.csdn.net/detail/u010105970/9493219中下载Tomcat服务器 第一步将Tomcat服务器的压缩包放在D:\dev

安装SQL2005 SP4补丁报错:无法安装Windows Installer MSP文件

在我们安装完SQL2005数据库后,需要安装SP4补丁时,会出错:无法安装Windows Installer MSP文件 的解决办法 1.开始--控制面板--添加或删除程序,卸载 "Microsoft SQL Server安装程序支持文件(英文)",确定没有残留该文件. 2.将SQL2005SP4补丁包进行复制,并将复制后的文件的格式从原来的.exe执行文件改为.rar的压缩文件.(就是把exe文件压缩) 3.打开压缩文件,查看文件,解压文件中 "hotfixsqlsuppo

Web服务器管理系列:1、安装Windows Server 2008

简单了解下服务器: 1U: 2U: 3U: 在安装Windows Server 2008之前我们先了解下Windows Server 2008: Windows Server 2008是微软一个服务器操作系统的名称,它继承Windows Server 2003. Windows Server 2008 有如下几种版本: 准备好安装光盘: 进入BIOS设置: BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统&

windows下安装apache服务器

一.安装Apache,配置成功一个普通网站服务器 运行下载好的"apache-win32-x86-no_ssl.msi",出现如下界面. 出现Apache HTTP Server的安装向导界面,点"Next"继续. 确认同意软件安装使用许可条例,选择"I accept the terms in the license agreement",点"Next"继续. 将Apache安装到Windows上的使用须知,请阅读完毕后,按&

在Linux和Windows系统上安装Nginx服务器的教程

在Linux和Windows系统上安装Nginx服务器的教程 ?1.在CentOS系统上安装Nginx 在 CentOS6 版本的 EPEL 源中,已经加入了 nginx 的 rpm 包,不过此 RPM 包版本较低.如果需要更新版本,可以使用官方制作的 rpm 包,或者使用源码包编译安装. 还可以使用一些二次开发功能增强的 nginx 版本,例如淘宝的 Tengine 和 OpenResty 都是不错的选择.1.1 常用编译参数 ??? --prefix=PATH:指定 nginx 的安装目录?

三、MDT 2013 Update 1批量部署-WINDOWS 7专业版安装(上)

三.MDT 2013 Update 1批量部署-WINDOWS 7专业版安装 3.1 导入WINDOWS 7专业版操作系统 这个对应WINDOWS 7专业版MSDN版安装光盘 其实Windows 7安装光盘里可以对应多个版本,为了简化显示,删除不需要的其他版本 3.2 建立WINDOWS 7安装任务 选择标准的客户端安装 查看标准客户端安装任务属性 查看新计算机的磁盘分区情况,标准安装任务默认会格式化硬盘,并按指定的属性分区.格式 这里的分区采用总容量的99% 恢复分区为剩余容量的100%,就是

windows本地安装SVN服务器

为更方便地管理本地的代码,也不麻烦别人,故可在本地搭一个SVN服务器 本文介绍的是通过VisualSVNServer,官网地址 http://www.visualsvn.com/server/ 下载后直接双击安装即可,默认仓库路径为"D:\Repositories".管理界面是类似于服务的,长相如下图 然后Creat User, Creat Repositories就行了. --------- 本地管理需要用到SVN客户端,官网http://tortoisesvn.net/ 安装完成后