慢的WUA(Windows Update API)

quu*_*uux 9 windows powershell winapi windows-update updates

我正在使用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 
Run Code Online (Sandbox Code Playgroud)

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

use*_*188 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 
Run Code Online (Sandbox Code Playgroud)

msdn