При просмотре API WSUS 3.0 я никак не могу определить, требуется ли данное обновление. . Перечисление UpdateInstallationState имеет значение 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 A Консоль администрирования?
Решение заключалось в самом объекте Update с его членом 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)