当看着WSUS 3.0API,我无法确定是否需要更新。更新安装状态枚举具有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 管理控制台中显示的值相同?
答案1
解决方案是更新对象本身及其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)