В том случае, если вы устанавливаете обновления Microsoft на компьютеры и сервера компании с собственного сервера WSUS, вы, вероятно, перед установкой обновлений выполняете их тестирование на пилотных группах компьютерах или серверах (разнести компьютеры и сервера по разным группам WSUS можно с помощью GPO). Как показывает практика последних лет, нельзя оставлять WSUS, настроенным на автоматическое одобрение всех новых обновлений сразу на продуктивные системы (Microsoft выпускает очень много сырых и недостаточно протестированных обновлений).
На WSUS сервере можно организовать несколько различных групп обновлений. Классическая схема одобрения новых обновлений на WSUS сервере сводится к тому, что сначала выполняется их тестирование на тестовых группах ПК и серверов (допустим группах Workstation_Testи Servers_Test), на которых в настройках WSUS созданы правила автоматического одобрения всех новых критических обновлений и обновлении безопасности (WSUS -> Options -> Automatic Approvals -> Default Automatic Approval Rule).
После того, как новые обновления установлены на тестовую группу и получено подтверждение, что обновления не вызвали проблем у пользователей (обычно тестирование занимает 3-4 дня), необходимо одобрить новые обновления для установки на продуктивные группы. Но как это сделать, чтобы не пришлось вручную выбирать новые обновления и одобрять их установку на все компьютеры и сервера? Я покажу два довольно простых способа переноса одобренных обновлений с тестовых групп WSUS на продуктивные.
Способ переноса одобренных обновлений в консоли WSUS
Вы можете достаточно удобно вручную скопировать одобренные обновления с тестовой группы WSUS на продуктивную группу компьютеров/серверов. Для этого нужно правильно настроить консоль Update Services.
В разделе Updates нужно создать новое представление для одобренных обновлений тестовой группы. Для этого выберите пункт меню New Update View.
В открывшемся мастере выберите пункт “Updates are approved for a specific group” (одобрения, одобренные для указанной группы) и укажите имя тестовой группы WSUS (Workstation_test). Укажите имя нового представления.
Выберите созданное вами представление и в меню фильтров выберите пункт Approval=”Approved” и Status=”Any”. Щелкнув по заголовку таблицы добавьте столбец, в котором указана дата выпуска обновления (Release Date). Щелкнув по имени столбца, отсортируйте список обновления, чтобы новые обновления оказались вверху.
Как вы видите, теперь в списке можно легко найти новые обновления и проверить статус их установки. С помощью клавиш Shift и/или Ctrl можно выбрать все необходимые обновления, которые нужно одобрить на продуктивных системах, вызвать контекстное меню правым щелчком мыши и выбрать пункт Approve. В списке групп WSUS выберите продуктивные группы, для которых нужно одобрить выделенные обновления и выберите пункт Approved for Install.
Теперь новые обновления будут устанавливать и на продуктивных системах.
Копирование одобренных обновлений между группами WSUS с помощью PowerShell
В том случае, если у вас имеется множество групп обновлений на WSUS сервере, перенос одобренных обновлений с тестовых групп на продуктивные можно автоматизировать с помощью PowerShell. У меня получился такой скрипт, в котором нужно указать FQDN имя сервера WSUS, и имя групп, между которыми нужно скопировать одобренные обновления.
$WsusServerFqdn='msk-wsus.winitpro.loc'
$WsusSourceGroup = 'Workstation_Test'
$WsusTargetGroup = 'WorkstationProduction'
[void][reflection.assembly]::LoadWithPartialName( «Microsoft.UpdateServices.Administration»)
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer( $WsusServerFqdn, $False, ‘8530’)
$Groups = $wsus.GetComputerTargetGroups()
$WsusSourceGroupObj = $Groups | Where {$_.Name -eq $WsusSourceGroup}
$WsusTargetGroupObj = $Groups | Where {$_.Name -eq $WsusTargetGroup}
$Updates = $wsus.GetUpdates()
$i = 0
ForEach ($Update in $Updates)
{
if ($Update.GetUpdateApprovals($WsusSourceGroupObj).Count -ne 0 -and $Update.GetUpdateApprovals($WsusTargetGroupObj).Count -eq 0)
{
$i ++
Write-Host («Approving » + $Update.Title)
}
}
Write-Output («Approved {0} updates for target group {1}» -f $i, $WsusTargetGroup)
Данный PowerShell скрипт последовательно перебирает все одобренные обновления в исходной группе WSUS и, если обновление не одобрено на целевой группе, одобряет его установку. В данном примере скрипт одобрил 64 обновления, которые были одобрены в тестовой группе и отсутствовали в продуктивной.
Добрый день, а как то вот читаю отзывы об обновлениях ( _https://www.askwoody.com/ ) и где то с марта побаиваюсь вообще что либо одобрят.
Как вообще проходили последние обновления, много проблем было? У меня 7 винда у всех и 2012 r2 сервера.
askwoody слишком истерично, на мой взгляд, пишут.
нормально апдейты ставятся и на 2008(R2) и на 2012 (R2) и на пользователей с win7/10 .
был глючный апдейт на word в марте, нашли, откатили, не проблема.
с 2008 r2 проблемы с сетевыми интерфейсами не наблюдалось (когда терялся статический ip-адрес). в общем, не надо ничего бояться. спокойно тестируйте и понемногу накатывайте на серверы. ущерба от взлома будет больше, чем от даунтайма сервера
ok скрипт, а если продуктив с подгруппами?
В общем-то ничего не меняется. Подгруппы WSUS это больше для структурирования объектов. Одобрять обновления нужно все равно для каждой группы отдельно. Скрипт несложно модифицировать для переноса апрувленных обновлений сразу на несколько целевых групп.
я думал что есть ключик типа «а также на все подгруппы».
Должен ли я видеть позже обновления со статусом «Не утверждено» которые попадают под «Автоутверждение»?
Не понял Вашего вопроса.
Есть обновление АБВ. Оно попало под Автоутверждение. Я открываю консоль и вижу его со статусом «Не утверждено». Такое допустимо?
Обновление актуальное? Не заменено и не отозвано?
я имел ввиду — меняет ли Автоутверджение на статус «Утверждено»? Или оно молча автоутрвеждает ничего не меняя.
надо бы отсеять обновы которые failed
Да, нужно отмененные и замененные апдейты исключать. Пусть это будет домашнее задание 🙂
Уважаемый автор!
А есть ли у Вас статейка (найти не могу) где описан принцип удаления старых апдейтов? А то новые одобряю,база растет, а как правильно почистить базу и удалить неактуальные апдейты — не понимаю.
Помогите пожалуйста!
А если оставите финансовые координаты, то скину копеечку на пиво! Ваш сайт супер!
На самом деле нет нормальных простых способов очистки базы WSUS от старых обновлений проблематично. Что-то умеет делать встроенный мастер обслуживания и очистки WSUS, но его возможности ограничены.
Более радикальный способ очистки совсем недавно обсуждали в комментариях к статье https://winitpro.ru/index.php/2010/10/14/udalenie-staryx-obnovlenij-na-windows-server-update-services-wsus/
Сделать донат в пользу проекта можно тут: https://winitpro.ru/index.php/donate/
Прошу прощения, но я так и не понял как исключить отмененные и заменненные апдейты
День добрый при выполнения срипта столкнулся с ошибкой
PS C:\script> C:\script\avto_Approving_appr.ps1
«Approved : The term ‘«Approved’ is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.
At C:\script\avto_Approving_apprNskcodocp02.ps1:26 char:15
+ Write-Output («Approved {0} updates for target group {1}» -f $i, $WsusTargetGrou …
+ ~~~~~~~~~
+ CategoryInfo : ObjectNotFound: («Approved:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Всё вопрос можно закрыть
У меня такая же ошибка:
«Approved : The term ‘«Approved’ is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was
included, verify that the path is correct and try again.
At D:\Scripts\Workstation.ps1:22 char:15
+ Write-Output («Approved {0} updates for target group {1}» -f $i, $Wsu …
+ ~~~~~~~~~
+ CategoryInfo : ObjectNotFound: («Approved:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Как поправить?
Уберите кавычки-елочки в скрипте. Замените на нормальные. Это баг движка сайта.
Если не оно, какая у вас версия Windows Server, WSUS и PowerShell?
С кавычками я разобрался сразу 🙂
WSUS 10.0.14393.2848
PowerShell 5.1.14393.2828
Windows Server 2016
Скрипт по факту вообще отрабатывает, но сыпет красные ошибки, как я указал выше.
А как применить на все дочерние группы?
Разобрался. Добавил несколько групп в $WsusTargetGroup и поместил весь код в цикл.
ForEach ($WsusTargetGroups in $WsusTargetGroup)
{
[void][reflection.assembly]::LoadWithPartialName(«Microsoft.UpdateServices.Administration»)
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer($WsusServerFqdn, $false, ‘8530’)
$Groups = $wsus.GetComputerTargetGroups()
$WsusSourceGroupObj = $Groups | Where {$_.Name -eq $WsusSourceGroup}
$WsusTargetGroupObj = $Groups | Where {$_.Name -eq $WsusTargetGroups}
$Updates = $wsus.GetUpdates()
$i = 0
ForEach ($Update in $Updates)
{
if ($Update.GetUpdateApprovals($WsusSourceGroupObj).Count -ne 0 -and $Update.GetUpdateApprovals($WsusTargetGroupObj).Count -eq 0)
{
$i ++
Write-Host («Approving » + $Update.Title)
$Update.Approve(‘Install’,$WsusTargetGroupObj) | Out-Null
}
}
Write-Output («Approved {0} updates for target group {1}» -f $i, $WsusTargetGroups)
Исключение при вызове «GetUpdateApprovals» с «1» аргументами: «Значение не может быть неопределенным.
Имя параметра: targetGroup»
C:\Users\Documents\wsus.ps1:12 знак:5
+ if ($Update.GetUpdateApprovals($WsusSourceGroupObj).Count -ne 0 -and …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentNullException
Исключение при вызове «GetUpdateApprovals» с «1» аргументами: «Значение не может быть неопределенным.
Имя параметра: targetGroup»
Добрый день!
Подскажите пожалуйста, а как исключить апдейты которые помечены на удаление?
Скажите, как поменять скрипт, если подключение ко WSUS у нас по HTTPS?
Сменил порт, но этого недостаточно:
[void][reflection.assembly]::LoadWithPartialName(«Microsoft.UpdateServices.Administration»)
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer( $WsusServerFqdn, $False, «8531»)
$Groups = $wsus.GetComputerTargetGroups()
$WsusSourceGroupObj = $Groups | Where {$_.Name -eq $WsusSourceGroup}
$WsusTargetGroupObj = $Groups | Where {$_.Name -eq $WsusTargetGroup}
$Updates = $wsus.GetUpdates()
$i = 0
ForEach ($Update in $Updates)
{
if ($Update.GetUpdateApprovals($WsusSourceGroupObj).Count -ne 0 -and $Update.GetUpdateApprovals($WsusTargetGroupObj).Count -eq 0)
{
$i ++
Write-Host («Approving » + $Update.Title)
$Update.Approve(‘Install’,$WsusTargetGroupObj) | Out-Null
}
}
Write-Output («Approved {0} updates for target group {1}» -f $i, $WsusTargetGroup)
Получаю ошибку на первую же строку:
Исключение при вызове «GetUpdateServer» с «3» аргументами: «Базовое соединение закрыто: Непредвиденная ошибка при приеме.»
C:\Scripts\WSUSUpdatesCopyFromTestToProduction.ps1:6 знак:1
+ $wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpda …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : WebException
1) Клиент доверяет сертификату на WSUS? он там случаем не самоподписанный?
2) Проверьте, какие версии TLS включены/отключены на WSUS сервере. Если WSUS принимает только TLS 1.2, чтобы форсировать его использование из сессии PowerShell, нужно в начале скрипта выполнить:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12