我正在使用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系统上。
答案 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