PSWindowsUpdate:从PowerShell管理Windows更新

时间:2020-01-09 10:46:47  来源:igfitidea点击:

使用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-WUHistorycmdlet,我们可以自动或者手动获取较早安装在计算机上的更新列表。

我们可以获取有关特定更新的安装日期的信息:

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-WindowsUpdatecmdlet。只需将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更新。