2014-12-06 73 views
9

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

我注意到这段代码可能需要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

你检查上该Windowsupdate.log,看看发生了什么?执行此操作之前,$ Searcher.GetTotalHistoryCount()会显示什么? – xXhRQ8sD2L7Z 2014-12-07 23:11:00

+0

ST8Z6FR57ABE6A8RE9UF - 在WindowsUpdate.log中没有任何异常。我看到$ Searcher.GetTotalHistoryCount()启动并立即完成(返回“46”); $ Searcher.Search($ Criteria)需要6秒钟才能完成。没有错误。 – quux 2014-12-08 18:05:37

+0

这很有趣,我知道你可以从注册表中获得数字,但所有信息都不在那里。也许它从SoftwareDistribution文件夹读取清单文件? – xXhRQ8sD2L7Z 2014-12-10 06:36:26

回答

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

+0

这似乎不太可能。 1)搜索我的电脑时发现没有wsusscan2.cab的拷贝2)在我能找到的所有文件中,它说这个文件必须在使用前下载。因此,虽然这是处理事情的一种方式,但它似乎不是系统使用的缓存。 – quux 2014-12-15 23:56:40

+0

此外:使用一个Invoke-Webrequest,(当前103 MB)文件下载需要比我原来的方法更长的时间! – quux 2014-12-16 00:07:42

+0

“Wsusscn2.cab”脱机缓存的用法是官方的并且有记录 - https://msdn.microsoft.com/en-us/library/ff647642.aspx - mbsa fyi生成,ime,与PowerShell方法类似的结果 – Patrick 2016-02-26 01:22:01