WSUS API 获取需要更新的计数

WSUS API 获取需要更新的计数

当看着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)

相关内容