PSWindowsUpdate:从PowerShell管理Windows更新
使用PowerShell的特殊" PSWindowsUpdate"模块从命令行界面管理Windows更新非常方便。 PSWindowsUpdate未集成到Windows中,它是Technet脚本库中提供的第三方模块。 PSWindowsUpdate允许管理员远程检查,安装,删除和隐藏Windows服务器和工作站上的更新。 PSWindowsUpdate模块对于管理Windows Server Core,没有图形界面的Hyper-V版本以及在审核模式下配置Windows镜像时的更新特别有用。
PSWindowsUpdate:安装Windows Update PowerShell模块
我们可以使用PackageManagement通过单个命令从联机存储库(PSGallery)在Windows 10和Windows Server 2015上安装PSWindowsUpdate模块:
Install-Module -Name PSWindowsUpdate
在我的情况下,出现警告,提示已安装PSWindowsUpdate 1.5.2.6. 要安装较新的模块版本,我们需要运行以下命令:
Install-Module -Name PSWindowsUpdate –Force
安装完成后,我们需要检查软件包:
Get-Package -Name PSWindowsUpdate
如果我们使用较旧的Windows版本(Windows 7/8.1/Windows Server 2008 R2/2012 R2),或者没有直接的Internet访问权限,则可以手动安装PSWindowsUpdate。
此模块可以安装在从Vista/Windows Server 2008开始且安装了PowerShell 2.0的任何受支持Windows版本上(尽管,建议使用PoSh 3.0或者更高版本)。
- 从此页面下载最新的PSWindowsUpdate版本:https://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc并取消阻止下载的文件;请注意,TechNet脚本库v 1.5.6中仅提供模块的旧版本。当NuGet软件包管理器从PowershellGallery安装PSWindowsUpdate 2.1.1.2时。可用的PowerShell cmdlet和参数在模块的不同版本中可能会有所不同。
- 使用PS模块将存档解压缩到以下目录之一:
%USERPROFILE%\Documents\WindowsPowerShell\Modules
或者 %
WINDIR%\System32\WindowsPowerShell\v1.0\Modules
(如果我们经常使用该模块,则最后一个更好);
- 允许脚本执行:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Unrestricted -Force
- 将模块导入到PowerShell会话中:
Import-Module PSWindowsUpdate
注意在Windows 7/Windows Server 2008 R2中,导入PSWindowsUpdate模块时,可能会出现以下错误:术语" Unblock-File"未被识别为cmdlet的名称。原因是该模块使用了某些仅在PowerShell 3.0中出现的功能。要使用这些功能,我们将必须更新PowerShell版本或者删除PowerShell版本。
| Unblock-File
手动从PSWindowsUpdate.psm1文件中删除一行。
在计算机上安装PSWindowsUpdate模块后,我们可以使用
Update-WUModule
cmdlet。例如,要将PSWindowsUpdate模块从计算机复制到两个远程服务器,请运行以下命令(我们需要通过SMB协议,TCP端口445访问远程服务器):
$Targets =" lon-fs02"," lon-db01" Update-WUModule -ComputerName $Targets Local
要将PoSh模块保存(导出)到共享的网络文件夹中,以便在其他计算机上进一步导入该模块,请运行:
Save-Module -Name PSWindowsUpdate –Path \lon-fs02\psmodules\
PSWindowsUpdate Cmdlet概述
我们可以在PSWindowsUpdate模块中显示可用cmdlet的列表,如下所示:
get-command -module PSWindowsUpdate
让我们简要描述一下模块命令的用法:
Clear-WUJob
使用Get-WUJob调用Task Scheduler中的WUJob;Download-WindowsUpdate
(别名为
Get-WindowsUpdate –Download
)获取更新列表并下载它们;
Get-WUInstall,Install-WindowsUpdate
(别名为
Get-WindowsUpdate –Install
)安装更新;
- " Hide-WindowsUpdate"(别名为
Get-WindowsUpdate -Hide:$false
)隐藏更新;
Uninstall-WindowsUpdate
使用Remove-WindowsUpdate删除更新;- Add-
WUServiceManager
在计算机上注册更新服务器(Windows Update Service Manager); Enable-WURemoting
启用Windows防火墙规则,以允许远程使用PSWindowsUpdate cmdlet;- " Get-WindowsUpdate"(Get-WUList)显示符合指定条件的更新列表,允许我们查找和安装更新。这是PSWindowsUpdate模块的主要cmdlet。允许从WSUS服务器或者Microsoft Update下载和安装更新。允许我们选择更新类别,特定更新并设置安装更新时计算机重新启动的规则;
Get-WUApiVersion
获取计算机上的Windows Update代理版本;- " Get-WUHistory"显示已安装更新的列表(更新历史记录);
Get-WUInstallerStatus
检查Windows Installer服务状态;Get-WUJob
在任务计划程序中运行WUJob更新任务;- 最后搜索和安装更新的日期(Get-WULastResults)(LastSearchSuccessDate和LastInstallationSuccessDate);
- Get-WURebootStatus允许我们检查是否需要重新启动才能应用特定的更新;
Get-WUServiceManager
列表更新源;Get-WUSettings
获取Windows Update客户端设置;Invoke-WUJob
在任务计划程序中远程调用WUJobs作业以立即执行PSWindowsUpdate命令;Remove-WindowsUpdate
允许通过KB ID卸载更新;Remove-WUServiceManager
禁用Windows Update服务管理器;- Set-PSWUSettings将PSWindowsUpdate模块设置保存到XML文件中;
- Set-WUSettings配置Windows Update客户端设置;
Update-WUModule
更新PSWindowsUpdate模块版本(我们可以通过从当前计算机复制它或者从PSGallery更新来更新远程计算机上的模块)。
PowerShell:列出可用于计算机的所有Windows更新
我们可以使用以下命令在更新服务器上列出此计算机可用的更新:
Get-WindowsUpdate
或者
Get-WUList
命令。
要检查远程计算机上可用更新的列表,请运行以下命令:
Get-WUList –ComputerName server2
我们可以检查Windows应该从何处获取更新。运行以下命令:
Get-WUServiceManager
ServiceID IsManaged IsDefault Name --------- --------- --------- --- 8b24b027-1dee-babb-9a95-3517dfb9c551 False False DCat Flighting Prod 855e8a7c-ecb3-4ca3-b045-1dfa50104289 False False Windows Store (DCat Prod) 3da21691-e49d-4da6-8a4b-b43877bcb1b7 True True Windows Server Update Service 9482f4b4-e343-44b6-b270-9a65bc822c77 False False Windows Update
如我们所见,计算机被配置为从本地WSUS服务器接收更新(Windows Server Update Service = True)。在这种情况下,我们应该看到为计算机批准的更新的列表。
如果要在Internet上的Microsoft Update服务器上扫描计算机(除了Windows更新,这些服务器还包含Office和其他Microsoft产品更新),请运行以下命令:
Get-WUlist -MicrosoftUpdate
我们将收到以下警告:
Get-WUlist : Service Windows Update was not found on computer. Use Get-WUServiceManager to get registered service.
要允许扫描Microsoft Update,请运行以下命令:
Add-WUServiceManager -ServiceID "7971f918-a847-4430-9279-4a52d1efe18d" -AddServiceFlag 7
我们现在可以扫描到Microsoft Update。如我们所见,在这种情况下,找到了Microsoft Visual C ++ 2008和Microsoft Silverlight的其他更新。
要在计算机上检查Windows Update代理的版本,请运行以下命令:
Get-WUApiVersion
ComputerName PSWindowsUpdate PSWUModuleDll ApiVersion WuapiDllVersion ------------ --------------- ------------- ---------- -------------- DESKTOP-J... 2.1.1.2 2.0.6995.28496 8.0 10.0.18362.387
要从计算机收到的更新列表中删除某些产品或者软件包,可以通过以下方式将其排除:
- 类别(-NotCategory);
- 标题(-NotCategory);
- 更新号(-NotKBArticleID)。
例如,让我们从更新列表中排除OneDrive,驱动程序和特定的KB:
Get-WUlist -NotCategory "Drivers" -NotTitle "OneDrive" -NotKBArticleID KB4489873
Install-WindowsUpdate:使用PowerShell安装Windows更新
要自动下载并安装计算机的所有可用更新,请运行以下命令:
Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -AutoReboot
AcceptAll键接受所有更新程序包的安装,并且AutoReboot允许Windows在安装更新后自动重新启动。
我们可以将更新安装历史记录保存到日志文件(可以使用它代替WindowsUpdate.log文件)。
Install-WindowsUpdate -AcceptAll -Install -AutoReboot | Out-File "c:\logs$(get-date -f yyyy-MM-dd)-WindowsUpdate.log" -force
我们只能按KB编号安装特定的更新程序包:
Get-WindowsUpdate -KBArticleID KB2267602, KB4533002 -Install
在这种情况下,我们需要手动确认每个更新的安装。
如果要从安装列表中排除某些更新,请运行以下命令:
Install-WindowsUpdate -NotCategory "Drivers" -NotTitle OneDrive -NotKBArticleID KB4011670 -AcceptAll -IgnoreReboot
使用PowerShell在远程计算机上安装Windows Update
PSWindowsUpdate模块允许我们一次在多个工作站或者服务器上远程安装更新(必须在这些计算机上安装/导入PSWindowsUpdate)。由于管理员不必在计划更新安装时手动登录所有服务器,因此非常方便。
几乎所有PSWindowsUpdate模块cmdlet都允许我们在远程计算机上管理和安装更新。为此,请使用属性:
-Computername server1, server2, server3
为了管理远程计算机上的更新,我们需要将主机名添加到Winrm可信主机列表中:
winrm set winrm/config/client ‘@{TrustedHosts="server1,server2,…"}’
在远程计算机上安装PSWindowsUpdate模块,并允许通过Windows Defender防火墙中的动态RPC端口访问进程dllhost.exe。
以下命令将所有可用更新安装在三台远程服务器上:
Invoke-WUInstall -ComputerName server1, server2, server3 -Script {ipmo PSWindowsUpdate; Get-WindowsUpdate -Install -AcceptAll -AutoReboot| Out-File C:\Windows\PSWindowsUpdate.log } -Confirm:$false -Verbose -SkipModuleTest –RunNow
在PSWindowsUpdate 2.1中,必须使用Invoke-WUJob而不是Invoke-WUInstall cmdlet。此cmdlet在SYSTEM下运行的远程计算机上创建调度程序任务。
在PSWindowsUpdate模块的较新版本中,使用以下命令在多台计算机上远程安装更新:
$ServerNames = "server1, server2, server3" Invoke-WUJob -ComputerName $ServerNames -Script {ipmo PSWindowsUpdate; Install-WindowsUpdate -AcceptAll | Out-File C:\Windows\PSWindowsUpdate.log } -RunNow -Confirm:$false
我们可以在远程计算机上安装更新,并向管理员发送电子邮件报告:
Install-WindowsUpdate -ComputerName nysrv1 -MicrosoftUpdate -AcceptAll - IgnoreReboot -SendReport –PSWUSettings @{SmtpServer="smtp.theitroad.local";From="[email protected]";To="[email protected]";Port=25} -Verbose
Get-WUHistory:使用PowerShell查看Windows更新历史记录
使用Get-WUHistory
cmdlet,我们可以自动或者手动获取较早安装在计算机上的更新列表。
我们可以获取有关特定更新的安装日期的信息:
Get-WUHistory| Where-Object {$_.Title -match "KB4517389"} | Select-Object *|ft
要了解更新是否已安装在多台远程计算机上,可以使用以下PowerShell代码:
"server1","server2" | Get-WUHistory| Where-Object {$_.Title -match "KB4011634"} | Select-Object *|ft
Remove-WindowsUpdate:卸载Windows更新
要从PowerShell正确卸载更新,可以使用Remove-WindowsUpdate
cmdlet。只需将KB号指定为KBArticleID参数的参数即可。要延迟计算机自动重启,请添加NoRestart键:
Remove-WindowsUpdate -KBArticleID KB4489873 -NoRestart
Hide-WindowsUpdate:如何使用PowerShell隐藏Windows更新?
我们可以隐藏特定的更新,以便Windows Update服务永远不会在计算机上安装这些更新(大多数情况下,我们需要隐藏驱动程序更新)。例如,要隐藏KB4489873和KB4489243更新,请运行以下命令:
`
$HideList = "KB4489873", "KB4489243"
Get-WindowsUpdate -KBArticleID $HideList –Hide
`
现在,下次使用Get-WUInstall命令扫描更新时,隐藏的更新将不会显示在可用于安装的更新列表中。
这样可以显示此计算机上隐藏的更新列表:
Get-WindowsUpdate –IsHidden
请注意,H(隐藏)属性已出现在隐藏更新的"状态"列中。
要从隐藏的更新中删除更新,请运行以下命令:
Get-WindowsUpdate -KBArticleID $HideList -WithHidden -Hide:$false
或者:
Show-WindowsUpdate -KBArticleID $HideList
对于那些在PowerShell控制台中感到不舒服的人,我建议使用graphicWindowsUpdate MiniTool
管理Windows 10更新。