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

WSUS API получить необходимое обновление, количество

Глядя на WSUS 3.0 API, я никак не могу определить, требуется ли данное обновление или нет. В UpdateInstallationState enum имеет NotApplicable значение со следующим описанием: "Обновление не распространяется на клиентский компьютер.".

Значит, это обновление может быть уже установлено и, следовательно, больше не применимо к целевому компьютеру.

Код Powershell будет подсчитывать для каждого обновления номер целевого компьютера, на котором это обновление применимо.

$updateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
$updateScope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::Any
$updateScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::All

$updatesCount = @{}
ForEach ($cpt in $WSUS.GetComputerTargets().GetEnumerator())
{
    ForEach ($updt in $cpt.GetUpdateInstallationInfoPerUpdate($updateScope))
    {
        If (-not $updatesCount.ContainsKey($updt.UpdateId))
        {
            $updatesCount.Set_Item($updt.UpdateId, 0)
        }

        If ($updt.UpdateInstallationState -eq [Microsoft.UpdateServices.Administration.UpdateInstallationState]::NotApplicable)
        {
            Continue
        }
        $updatesCount[$updt.UpdateId] += 1
    }
}

Запустив этот код на моем сервере WSUS, я не получу обновлений, которые неприменимы (счетчик равен 0). Однако в администрировании консоли WSUS я вижу некоторые обновления, которые не нужны.

Как я могу узнать, действительно ли компьютерной цели требуется обновление, и рассчитать Необходимое количество значение, как показано в консоли администрирования WSUS?

Решение было в Обновить сам объект с его State член.

В NotNeeded состояние устанавливается только в том случае, если сервер обновлений хранит пакеты локально, поэтому это необходимо проверить в конфигурации.

Также состояние пакета привязано к состоянию утверждения. Поэтому, если пакет был одобрен, но не загружен и не установлен, предполагается, что пакет не нужен.

Я проверил, и это отражает поведение консоли администрирования WSUS.

$toDecline = @()
If ($WSUS.GetConfiguration().HostBinariesOnMicrosoftUpdate -or $WSUS.GetConfiguration().DownloadUpdateBinariesAsNeeded)
{
    ForEach ($updt in $WSUS.GetUpdates($updateScope).GetEnumerator())
    {
        If ($updt.IsDeclined)
        {
            Continue
        }

        If ($updt.State -eq [Microsoft.UpdateServices.Administration.UpdateState]::NotNeeded -or $updt.State -eq [Microsoft.UpdateServices.Administration.UpdateState]::Ready)
        {
            $updtSummary = $updt.GetSummary($computerScope)
            If ($updtSummary.DownloadedCount -eq 0 -and $updtSummary.InstalledCount -eq 0)
            {
                $toDecline += $updt.Id
            }
        }
    }
}
Write-Verbose("Number of uneeded updates: {0}." -f $toDecline.Length)