Getting the CVE ID Property of an update from WSUS API via Powershell
- by thebitsandthebytes
I am writing a script in Powershell to get the update information from each computer and correlate the information with another System which identifies updates by CVE ID. I have discovered that there is a "CVEIDs" property for an update in WSUS, which is documented in MSDN, but I have no idea how to access the property. Retrieving the CVE ID from WSUS is the key to this script, so I am hoping someone out there can help!
Here is the property that I am having difficulty accessing:
IUpdate2::CveIDs Property -
http://msdn.microsoft.com/en-us/library/aa386102(VS.85).aspx
According to this, the IUnknown::QueryInterface method is needed to interface IUpdate2 -
"http://msdn.microsoft.com/en-us/library/ee917057(PROT.10).aspx"
"An IUpdate instance can be retrieved by calling the IUpdateCollection::Item (opnum 8) (section 3.22.4.1) method.
The client can use the IUnknown::QueryInterface method to then obtain an IUpdate2, IUpdate3, IUpdate4, or IUpdate5 interface. Additionally, if the update is a driver, the client can use the IUnknown::QueryInterface method to obtain an IWindowsDriverUpdate, IWindowsDriverUpdate2, IWindowsDriverUpdate3, IWindowsDriverUpdate4, or IWindowsDriverUpdate5 interface. "
Here is a skeleton of my code:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | Out-Null
if (!$wsus)
{
Returns an object that implements IUpdateServer
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($server, $false, $port)
}
$computerScope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
$updateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
$updateScope.UpdateSources = [Microsoft.UpdateServices.Administration.UpdateSources]::MicrosoftUpdate
$wsusMachines = $wsus.GetComputerTargets($computerScope)
foreach machine in QSUS, write the full domain name
$wsusMachines | ForEach-Object {
Write-host $.FullDomainName
$updates = $.GetUpdateInstallationInfoPerUpdate($updateScope)
foreach update for each machine, write the update title, installation state and securitybulletin
$updates | ForEach-Object {
$update = $wsus.GetUpdate($.UpdateId) # Returns an object that implements Microsoft.UpdateServices.Administration.IUpdate
$updateTitle = $update.Title | Write-Host
$updateInstallationState = $.UpdateInstallationState | Write-Host
$updateSecurityBulletin = $update.SecurityBulletins | Write-Host
$updateCveIds = $update.CveIDs # ERROR: Property 'CveIDs' belongs to IUpdate2, not IUpdate
}
}