慢的WUA(Windows Update API)

时间:2014-12-06 22:42:42

标签: windows winapi powershell updates windows-update

我正在使用PowerShell脚本来执行一些Windows Update任务。大多数任务都围绕使用下面的代码段获取尚未应用的Windows更新集合。一旦返回该集合,我将遍历它并执行隐藏,下载或安装更新等任务。

我注意到这段代码可能需要6到115秒才能运行。通常,较长的运行时间是机器重新启动或闲置超过15分钟。

但是,如果我打开Windows Update控制面板项,立即知道有多少未完成的更新,并且可以为我提供这些未完成更新的列表(集合)。如果我点击WU的“检查更新”链接,将需要> 10秒再次检查,有时该检查会产生与我在打开时立即“知道”不同的结果。

所以我假设WUA在某处维护了一个缓存的更新集合,可能每天自动更新一次。 我的问题:我的代码如何访问该缓存,而不是运行下面显示的更长的“检查更新”代码?具体来说,我希望能够快速获得一个IUpdateCollection来使用。

$Session = New-Object -ComObject Microsoft.Update.Session            
$Searcher = $Session.CreateUpdateSearcher()
$Searcher.Online = $false  #tested $true and $false; $true slightly slower
$Criteria = "IsInstalled=0 and Type='Software'"
$SearchResult = $Searcher.Search($Criteria)           
$SearchResult.Updates 

请注意,所有这些都发生在当前的Windows2012R2系统上。

1 个答案:

答案 0 :(得分:3)

看起来缓存是一个名为wsusscn2.cab的CAB文件,它定期从MSFT下载。我在下面发布的msdn链接中有一个直接链接。也许编写一个脚本,每天/每周下载一次(如果这将是一个广泛部署的脚本,可能是网络共享),然后更改脚本以强制它始终查看CAB文件而不是在线。 喜欢这样:

$Session = New-Object -ComObject Microsoft.Update.Session       
$UServiceManager = New-Object -ComObject Microsoft.Update.ServiceManager
$UService =  $UServiceManager.AddScanPackageService("Offline Sync Service", "c:\wsusscn2.cab") 
$Searcher = $Session.CreateUpdateSearcher()
$Searcher.ServerSelection = 3  
$Searcher.ServiceID = $UService.ServiceID
$Criteria = "IsInstalled=0 and Type='Software'"
$SearchResult = $Searcher.Search($Criteria)           
$SearchResult.Updates 

msdn