Глядя на 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)