Made some progress, the secret was OriginUri was part of GetInstallableItems
[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$ErrorActionPreference = 'Stop'
$WSUS = Get-WsusServer
Write-Host "WSUS Name: " $WSUS.Name
$ApprovedUpdates = $WSUS.GetUpdate
$UpdateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
$UpdateScope.FromCreationDate = (Get-Date).AddDays(-30)
#TODO: Search for patches approved since last patch tuesday
$UpdateScope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::LatestRevisionApproved
$updates = $WSUS.GetUpdates($UpdateScope)
Write-Host "Last Update: "(($WSUS.GetSubscription()).LastSynchronizationTime).DateTime
Write-Host "UpdateCount: "$updates.count
Write-Host
Write-Host "Patches:"
foreach ($item in $updates) {
Write-Host $item.KnowledgebaseArticles $item.title
$Update = $wsus.GetUpdate([Guid]($item.Id).UpdateId)
$DownloadFolder = Join-Path -Path "D:\UpdateFiles" -ChildPath ($item.Title).ToString()
$PathResult = New-Item -ItemType Directory -Force -Path $DownloadFolder
Foreach ($file in $item) {
$PatchNames = $Update.GetInstallableItems() | select -ExpandProperty files | select -Property Name
$PatchUri = $UpdateUri.OriginUri.AbsoluteUri
$PatchCount = $PatchNames.Name.Count
$PatchCount
For ($Count=0; $Count -le $PatchCount; $Count++) {
Write-Host $Count, $PatchNames.name[$Count]
$DownloadName = Join-Path -Path $DownloadFolder -ChildPath $PatchNames.Name[$Count]
$Job = Start-BitsTransfer -Source $PatchUri[$Count] -Destination $DownloadName -ErrorAction Stop
While( ($Job.JobState.ToString() -eq 'Transferring') -or
($Job.JobState.ToString() -eq 'Connecting') -or !($Job.JobState.ToString() -eq 'Error') )
{
$pct = [int](($Job.BytesTransferred*100) / $Job.BytesTotal)
Write-Progress -Activity "Copying file..." -CurrentOperation "$pct% complete"
}
Complete-BitsTransfer -BitsJob $Job
}
}
}