WSUS CatalogVersion mismatch in SCCM


Problem

After recovering WSUS or SCCM, Software-Updates will no longer install on SCCM Clients. In the UpdatesDeployment.log, you will get:
'EnumerateUpdates for action (UpdateActionInstall) - Total actionable updates = 0 '

If you run the following PowerShell command on a Client to list all "missing" updates based on the WSUS Catalog:

get-wmiobject -query "SELECT * FROM CCM_UpdateStatus" -namespace "root\ccm\SoftwareUpdates\UpdatesStore" | where {$_.status -eq "Missing"} 

you will get a list of updates that are "missing".

But the SCCM Agent does not recognize these updates as applicable (cross check if you have deployed the updates in SCCM !). The following PowerShell command lists all "pending" Software Updates on a Client that are deployed in SCCM...

 get-wmiobject -query "SELECT * FROM CCM_SoftwareUpdate" -namespace "ROOT\ccm\ClientSDK"

... and you will not get a Result because the SCCM Agent does not detect the Updates as "actionable".


Cause

Every time SCCM has successfully synchronized the WSUS catalog, it increments the "Catalog Version".

After a Site recovery, it can happen that SCCM resets that counter and starts from 0.

The Problem with a "Catalog Version" reset is that SCCM stores the minimum Catalog Version in every Update that was Synchronized... That means, as long as your CatalogVersion has not reached the minCatalogVersion of your Update, the Update will NOT install.


Solution

The following SQL Query will check all Updates and get the highest "MinCatalogVersion" from all your Updates...

;WITH XMLNAMESPACES ( DEFAULT 'http://schemas.microsoft.com/SystemsCenterConfigurationManager/2009/07/10/DesiredConfiguration') 
SELECT MAX(CI.SDMPackageDigest.value('(/DesiredConfigurationDigest/SoftwareUpdateBundle/ConfigurationMetadata/Provider/Operation[@Name="Detect"]/Parameter/Property[@Name="MinCatalogVersion"]/@Value)[1]', 'int')) MinCatalogVersion 
FROM [CI_ConfigurationItems] as CI 
WHERE CIType_ID = 8

as a Result, you will get the highest CatalogVersion that is required in your Site.

You can now use the returned Value and "tweak" SCCM to use this Value as latest Catalog Version. SCCM stores the CatalogVersion in the Registry. The Version in the Example above (CatalogVersion=1430) looks like:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Components\SMS_WSUS_SYNC_MANAGER]
"ContentVersion"=1430
"SyncToVersion"=1430
"LastAttemptVersion"=1429

After the Registry-Change, you have to run "Synchronize Software Updates" from the SCCM Console. After the synchronization, the Catalog should have at least the Version you have defined.

SCCM agents must run a "Machine-Policy refresh" to get the latest Catalog Version and an "Update Evaluation Cycle" to get the change... your updates should start installing and in the UpdatesDeployment.log you will see that the Updates are now "actionable".