Как вы, вероятно, знаете, теперь невозможно выбрать конкретные обновления для утверждения или отклонения в WSUS для более старых операционных систем Windows. Для серверов, вообще говоря, сейчас есть только два типа: набор обновлений безопасности за месяц и комплексный набор обновлений, который включает все обновления безопасности и «качественные» обновления.
Что касается серверов, меня интересует только оценка и утверждение обновлений безопасности, и я откажусь от всех «качественных» обновлений. Однако обновления качества и безопасности, похоже, сгруппированы в один класс и классификационные категории MSRC. Единственный способ отличить их, по-видимому, заключается в самом заголовке обновления (т.е. включает ли заголовок обновления «качество» или нет).
Поскольку названия обновлений качества и безопасности очень похожи, и я не вижу простого способа полностью разделить их друг от друга в представлении WSUS, я боюсь, что в конечном итоге я или кто-то другой проявлю небрежность и одобрим качественное обновление по ошибке. Лучший способ решить эту проблему - просто автоматически отклонять все качественные обновления.
Кто-нибудь знает, как это сделать? Альтернативное решение может заключаться в том, чтобы найти представление в WSUS, которое упрощает различение между обновлениями качества и безопасности, или вообще не отображать обновления качества сервера в WSUS.
Сервер WSUS - это Windows 2008 R2, а версия WSUS - 3.2.7600.226.
Этот сценарий PowerShell можно использовать для автоматической блокировки всех новых обновлений качества в WSUS. Он должен запускаться непосредственно на сервере WSUS. Что касается того, как работает сценарий, сначала он ищет неутвержденные устанавливаемые обновления со словом «качество» в заголовке. Если обнаруживаются какие-либо такие обновления, они перечисляются, и пользователю предоставляется возможность продолжить и заблокировать обновления или нет с помощью приглашения ввода.
[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
$updateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
# Retrieve only updates that have not yet been approved
$updateScope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::NotApproved
# Retrieve only updates that are installable
$updateScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::NotInstalled
$totalUpdateCount = $wsus.GetUpdateCount($updateScope)
$qualityUpdates = $wsus.GetUpdates($updateScope) | Where-Object {$_.Title -like '*quality*'}
$qualityUpdateCount = $qualityUpdates.Length
if ($qualityUpdateCount -gt 0) {
$qualityUpdates | select title
Write-Host "=========================================="
$confirmation = Read-Host "$qualityUpdateCount quality updates out of $totalUpdateCount total non-approved installable updates were found. Decline? (y/n)"
if ($confirmation -eq 'y') {
$wsus.GetUpdates($updateScope) | Where-Object {$_.Title -like '*quality*'} | ForEach {
Write-Verbose ("Declining {0}" -f $_.Title) -Verbose
$_.Decline()
}
}
} Else {
Write-Host "No non-approved installable updates were found."
}
Если вы хотите автоматически отклонять качественные обновления, запустите слегка измененную версию вышеуказанного скрипта как задачу Windows.
[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
$updateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
# Retrieve only updates that have not yet been approved
$updateScope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::NotApproved
# Retrieve only updates that are installable
$updateScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::NotInstalled
$totalUpdateCount = $wsus.GetUpdateCount($updateScope)
$qualityUpdates = $wsus.GetUpdates($updateScope) | Where-Object {$_.Title -like '*quality*'}
$qualityUpdateCount = $qualityUpdates.Length
if ($qualityUpdateCount -gt 0) {
$wsus.GetUpdates($updateScope) | Where-Object {$_.Title -like '*quality*'} | ForEach {
$_.Decline()
}
}
ПРИМЕЧАНИЕ: я пишу приведенный выше сценарий с некоторой помощью от Отличное руководство по созданию сценариев WSUS на PowerShell от Boe Prox.