【问题标题】:Slow WUA (Windows Update API)慢 WUA(Windows 更新 API)
【发布时间】:2015-02-04 21:28:36
【问题描述】:

我正在编写一个 PowerShell 脚本来执行一些 Windows 更新任务。大多数任务都围绕着使用下面的代码 sn-p 获取尚未应用的 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 系统上。

【问题讨论】:

  • 您是否检查过 WindowsUpdate.log 以了解发生了什么? $Searcher.GetTotalHistoryCount() 在运行之前显示什么?
  • ST8Z6FR57ABE6A8RE9UF - WindowsUpdate.log 中没有异常。我看到 $Searcher.GetTotalHistoryCount() 立即开始并完成(返回“46”); $Searcher.Search($Criteria) 需要六秒钟才能完成。没有错误。
  • 这很有趣,我知道您可以从注册表中获取号码,但所有信息都不在其中。也许它从 SoftwareDistribution 文件夹中读取清单文件?

标签: windows winapi powershell updates windows-update


【解决方案1】:

看起来缓存是一个名为 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

【讨论】:

  • 这似乎不太可能。 1) 搜索我的计算机,没有发现 wsusscan2.cab 的副本 2) 在我能找到的所有文档中,都说这个文件必须在使用前下载。因此,虽然这是处理事物的一种方式,但它似乎不是系统使用的缓存。
  • 另外:使用 Invoke-Webrequest,(当前 103 MB)文件下载比我原来的方法花费的时间更长!
  • Wsusscn2.cab 离线缓存的使用是官方的并记录在案 - msdn.microsoft.com/en-us/library/ff647642.aspx - mbsa fyi 产生的结果与 powershell 方法类似
  • Patrick:是的,它已记录在案。可以这样编写脚本,我有 (gist.github.com/bklockwood/716d9f582dd78a9e6e9e) .. 但这似乎不是 OS 本身 实际缓存此类数据的方式。不过,感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2016-12-20
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多