Для управления обновлениями Windows можно использовать PowerShell модуль PSWindowsUpdate. Этот модуль доступен для загрузки из PowerShell Gallery и позволяет администраторам сканировать, скачивать, устанавливать, удалять или скрывать обновления на локальных или удаленных рабочих станциях и серверах Windows.
1. Установка модуля PSWindowsUpdate
В современных версиях Windows 10/11 и Windows Server 2022/2019/2016 модуль PSWindowsUpdate можно установить из онлайн репозитория PowerShell Gallery с помощью команды:
Install-Module -Name PSWindowsUpdate
Подтвердите добавление репозитория, нажав Y. Чтобы убедиться, что модуль установлен:
Get-Package -Name PSWindowsUpdate
Также PSWindowsUpdate можно установить в офлайн-режиме. В изолированной среде для установки потребуется предварительное обновление PowerShell.
Вы можете также установить модуль удалённо на другие компьютеры:
$Targets = "srv1.winitpro.loc", "srv2.winitpro.loc"
Update-WUModule -ComputerName $Targets -local
Политика выполнения PowerShell скриптов в Windows по умолчанию блокирует запуск командлетов из сторонних модулей. Чтобы разрешить выполнение скриптов, выполните:
Set-ExecutionPolicy –ExecutionPolicy RemoteSigned -force
После этого импортируйте модуль в сессию PowerShell:
Import-Module PSWindowsUpdate
Проверьте список команд, доступных в модуле:
Get-command -module PSWindowsUpdate
Для проверки текущих настроек Windows Update на вашем компьютере выполните команду:
Get-WUSettings
Пример вывода:
ComputerName : WKS22122
WUServer : http://MS-WSUS:8530
WUStatusServer : http://MS-WSUS:8530
AcceptTrustedPublisherCerts : 1
ElevateNonAdmins : 1
DoNotConnectToWindowsUpdateInternetLocations : 1
TargetGroupEnabled : 1
TargetGroup : WorkstationsProd
NoAutoUpdate : 0
AUOptions : 3 - Notify before installation
ScheduledInstallDay : 0 - Every Day
ScheduledInstallTime : 3
UseWUServer : 1
AutoInstallMinorUpdates : 0
AlwaysAutoRebootAtScheduledTime : 0
DetectionFrequencyEnabled : 1
DetectionFrequency : 4
В этом примере клиент Windows Update настроен с помощью GPO на получение обновлений с локального сервера WSUS.
2. Сканировать и загрузить обновления с помощью PowerShell
Для сканирования компьютера на наличие обновлений выполните команду:
Get-WindowsUpdate
Также можно использовать команду:
Get-WUList
Команда должна вывести список обновлений, которые нужно установить на вашем компьютере.
Команда Get-WindowsUpdate при первом запуске может вернуть ошибку:
Value does not fall within the expected range.
Для исправления ошибки нужно сбросить настройки агента Windows Update, перерегистрировать библиотеки и восстановить исходное состояние службы wususerv с помощью команды:
Reset-WUComponents -Verbose
Чтобы проверить источники обновлений (например, серверы Microsoft или локальный WSUS):
Get-WUServiceManager
В этом примере вы видите, компьютер настроен на получение обновлений с локального сервера WSUS (Windows Server Update Service = True). В этом случае вы должны увидеть список обновлений, одобренных для вашего компьютера на WSUS.
Если хотите сканировать обновления с серверов Microsoft Update (включая обновления для Office):
Get-WUlist -MicrosoftUpdate
Если при попытке поиска обновлений вы получаете предупреждение:
Get-WUlist : Service Windows Update was not found on computer
Чтобы разрешить сканирование на Microsoft Update, выполните команду:
Add-WUServiceManager -ServiceID "7971f918-a847-4430-9279-4a52d1efe18d" -AddServiceFlag 7
Чтобы убрать определенные продукты или конкретные KB из списка обновлений, которые получает ваш компьютер, вы их можете исключить по:
— Категории (-NotCategory);
— Названию (-NotTitle);
— Номеру обновления (-NotKBArticleID).
Например, чтобы исключить из списка обновления драйверов, OneDrive, и одну конкретную KB:
Get-WUlist -NotCategory "Drivers" -NotTitle OneDrive -NotKBArticleID KB4533002
Скачать все доступные обновления на компьютер (обновления загружаются в локальный кэш обновлений в каталоге C:\Windows\SoftwareDistribution\Download):
Get-WindowsUpdate -Download -AcceptAll
Windows загрузит все доступные патчи сервера обновлений (MSU и CAB файлы) в локальный каталог обновлений, но не запустит их автоматическую установку.
3. Установка обновлений Windows с помощью команды Install-WindowsUpdate
Чтобы автоматически скачать и установить все доступные обновления для вашей версии Windows с серверов Windows Update (вместо локального WSUS), выполните:
Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -AutoReboot
Ключ AcceptAll включает одобрение установки для всех пакетов, а AutoReboot разрешает автоматическую перезагрузку Windows после завершения установки обновлений.
Дополнительно можно использовать следующие параметры:
— IgnoreReboot — запретить автоматическую перезагрузку.
— ScheduleReboot — задать точное время перезагрузки компьютера.
Пример команды для сохранения истории установки обновлений в лог-файл:
Install-WindowsUpdate -AcceptAll -Install -AutoReboot | Out-File "c:\$(get-date -f yyyy-MM-dd)-WindowsUpdate.log" -force
Если вам нужно установить только конкретные обновления по номерам KB, используйте:
Get-WindowsUpdate -KBArticleID KB2267602, KB4533002 -Install
Если вы хотите исключить определённые обновления, например драйверы или пакеты OneDrive, выполните следующую команду:
Install-WindowsUpdate -NotCategory "Drivers" -NotTitle OneDrive -NotKBArticleID KB4011670 -AcceptAll -IgnoreReboot
Чтобы проверить, требуется ли перезагрузка компьютера после установки обновлений, выполните команду:
Get-WURebootStatus
4. Просмотр истории установленных обновлений в Windows
Для просмотра списка всех установленных обновлений, используйте следующую команду:
Get-WUHistory
Чтобы найти информацию о конкретном обновлении по его номеру KB, выполните:
Get-WUHistory | Where-Object {$_.Title -match "KB4517389"} | Select-Object *
Для вывода дат последнего успешного сканирования и установки обновлений на компьютере:
Get-WULastResults | Select-Object LastSearchSuccessDate, LastInstallationSuccessDate
5. Удаление обновлений в Windows с помощью PowerShell
Для удаления конкретного обновления, используя его номер KB, выполните:
Remove-WindowsUpdate -KBArticleID KB4011634
6. Скрыть ненужные обновления Windows с помощью PowerShell
Вы можете скрыть определённые обновления, чтобы они не отображались в списке доступных для установки. Например, для скрытия обновлений с номерами KB2538243 и KB4524570 выполните:
$HideList = "KB2538243", "KB4524570"
Get-WindowsUpdate -KBArticleID $HideList -Hide
Или используйте сокращённую команду alias:
Hide-WindowsUpdate -KBArticleID $HideList -Verbose
Чтобы отменить скрытие обновлений:
Show-WindowsUpdate -KBArticleID $HideList
Для просмотра списка всех скрытых обновлений выполните команду:
Get-WindowsUpdate –IsHidden
7. Управление обновлениями Windows на удалённых компьютерах через PowerShell
Все командлеты модуля PSWindowsUpdate можно использовать для управления обновлениями на удалённых компьютерах, используя параметр -Computername Host1, Host2, Host3. На удалённых компьютерах должен быть включён и настроен WinRM (это можно сделать вручную или через GPO). Модуль PSWindowsUpdate работает как в доменных сетях, так и в рабочей группе.
Для добавления имён компьютеров в список доверенных хостов WinRM, выполните следующую команду:
winrm set winrm/config/client ‘@{TrustedHosts="HOST1,HOST2,…"}’
Или используйте PowerShell для настройки:
Set-Item wsman:\localhost\client\TrustedHosts -Value "HOST1,HOST2" -Force
Чтобы развернуть модуль PSWindowsUpdate на удалённых компьютерах и настроить необходимые порты, выполните следующие команды:
Invoke-Command -ComputerName $computer -ScriptBlock {Set-ExecutionPolicy RemoteSigned -force }
Invoke-Command -ComputerName $computer -ScriptBlock {Import-Module PSWindowsUpdate; Enable-WURemoting}
Для проверки доступных обновлений на удалённых компьютерах используйте:
Get-WUList –ComputerName server2
Для установки всех доступных обновлений на нескольких серверах:
$ServerNames = "server1, server2, server3"
Invoke-WUJob -ComputerName $ServerNames -Script {ipmo PSWindowsUpdate; Install-WindowsUpdate -AcceptAll | Out-File C:\Windows\PSWindowsUpdate.log} -RunNow -Confirm:$false -Verbose -ErrorAction Ignore
Вы можете так же указать точное время для запуска задания по установке обновлений:
Invoke-WUJob -ComputerName $ServerNames -Script {ipmo PSWindowsUpdate; Install-WindowsUpdate –AcceptAll -AutoReboot | Out-File C:\Windows\PSWindowsUpdate.log } -Confirm:$false -TriggerDate (Get-Date -Hour 20 -Minute 0 -Second 0)
Для проверки статуса задания на удалённых компьютерах выполните:
Get-WUJob -ComputerName $ServerNames
Если команда вернет пустой список, значит задача установки на всех компьютерах выполнена.
Проверьте наличие обновления на нескольких удаленных компьютерах:
"server1","server2" | Get-WUHistory| Where-Object {$_.Title -match "KB4011634"} | Select-Object *|ft
Получить дату последней установки обновлений на всех компьютерах в домене можно с помощью командлета Get-ADComputer из модуля AD PowerShell:
$Computers=Get-ADComputer -Filter {enabled -eq "true" -and OperatingSystem -Like '*Windows*' }
Foreach ($Computer in $Computers)
{
Get-WULastResults -ComputerName $Computer.Name|select ComputerName, LastSearchSuccessDate, LastInstallationSuccessDate
}
Модуль PowerShell PSWindowsUpdate является удобным инструментом для загрузки и установки обновлений Windows через командную строку. Это особенно важно для серверов, которые работают без графического интерфейса, таких как Windows Server Core и Hyper-V Server. Кроме того, данный модуль незаменим в ситуациях, когда необходимо одновременно инициировать и контролировать процесс установки обновлений на множестве серверов или рабочих станций Windows.