Назад | Перейти на главную страницу

Как автоматически отклонять качественные накопительные обновления в WSUS

Как вы, вероятно, знаете, теперь невозможно выбрать конкретные обновления для утверждения или отклонения в 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.