Как CreateUpdateDownloader узнает, какие файлы нужно загружать?

Как CreateUpdateDownloader загружает файлы? Я спрашиваю, потому что в моей системе не хватает 4 КБ.

Я получаю название 4 отсутствующих КБ, перебирая коллекцию обновлений в моем скрипте.

Когда я назначаю эту коллекцию CreateUpdateDownloader, я нахожу только 1 КБ в C:\Windows\SoftwareDistribution\Download.

Любые мысли, почему он не загрузил остальные 3 КБ? Да, я только хочу отсканировать и загрузить прямо сейчас - пытаюсь узнать, как это работает, наблюдая за этим в действии. Я установлю позже, так как хочу настроить некоторые из них.

Код следующий:

Dim session : Set session = CreateObject("Microsoft.Update.Session")
Dim search  : Set search  = session.CreateUpdateSearcher()

WScript.Echo "Searching for updates..." & vbCrLF

Set result = search.Search("IsInstalled=0 AND Type='Software' AND IsHidden=0")

WScript.Echo "Missing KBs:"
For i = 0 To result.Updates.Count -1 'last item in the collection always seems to be some kind of gibberish null.
    Set update = result.Updates.Item(i)
    WScript.Echo i + 1 & "> " & update.Title
Next

If result.Updates.Count = 0 Then
    WScript.Echo "There are no applicable updates."
End If

Set downloader = session.CreateUpdateDownloader() 
downloader.Updates = result.Updates ' updatesToDownload
downloader.Download()

person MGoBlue93    schedule 01.08.2017    source источник
comment
исходный сценарий проверяет наличие обновлений, которые могут запрашивать ввод данных пользователем или представлять лицензионное соглашение. Может быть здесь дело в этом? Что говорит %windir%\WindowsUpdate.log?   -  person Ansgar Wiechers    schedule 02.08.2017
comment
@AnsgarWiechers... спасибо за ответ. В Win 10 журналы представляют собой файлы *.etl, которые необходимо открывать с помощью средства просмотра событий. Тем не менее, журналы не имеют каких-либо предупреждений или ошибок. Кроме того, поскольку исходный сценарий содержал лицензионное соглашение/подтверждение после загрузки, я надеялся, что он хотя бы сначала загрузит базы знаний. Но он загружает только один из них, а не все четыре, которые мне нужны.   -  person MGoBlue93    schedule 02.08.2017
comment
В конце концов, я хочу взять КБ и подключить их к компьютерам, которые НИКОГДА не будут подключаться к Интернету ... поэтому меня сейчас не интересует установочная часть исходного сценария. При запуске базы знаний вне WSUS переключатель /q в любом случае позаботится о лицензионном соглашении.   -  person MGoBlue93    schedule 02.08.2017
comment
Код PowerShell с аналогичной функциональностью находится по адресу https://gist.github.com/altrive/5268181   -  person JoSerra    schedule 03.08.2017


Ответы (1)


Необходимо использовать Microsoft.Update.UpdateColl для сбора обновлений для загрузки. Функция CopyFromCache позволяет загрузить локальную копию обновления. Свойство DownloadURL позволит вам получить загрузку из Интернета. Очень полезная документация по iupdate

Это мой "первый" подход к коду. Первые 5 обновлений загружаются в каталог d:\updates и указываются соответствующие URL-адреса.

Dim session : Set session = CreateObject("Microsoft.Update.Session")
Dim search  : Set search  = session.CreateUpdateSearcher()
WScript.Echo "Searching for updates..." & vbCrLF
Set result = search.Search("IsInstalled=0 AND Type='Software' AND IsHidden=0")
WScript.Echo "Missing KBs:"
For i = 0 To result.Updates.Count -1 'last item in the collection always seems to be some kind of gibberish null.
    Set update = result.Updates.Item(i)
    WScript.Echo i + 1 & "> " & update.Title
Next
If result.Updates.Count = 0 Then
    WScript.Echo "There are no applicable updates."
End If

Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")
Set downloader = session.CreateUpdateDownloader() 
'For I = 0 to result.Updates.Count-1
For I = 0 to 5
    Set update = result.Updates.Item(I)
    updatesToDownload.Add(update)
Next
WScript.Echo vbCRLF & "Downloading updates..."
downloader.Updates = updatesToDownload
downloader.Download()

'For I = 0 to result.Updates.Count-1
for i=0 to 5
  for each upd in downloader.Updates.Item(i).BundledUpdates
   upd.CopyFromCache "d:\UPDATES", False
   for each content in upd.DownloadContents
     wscript.echo "url: " & content.DownloadURL
   next 
  next 
next 
person JoSerra    schedule 03.08.2017
comment
Спасибо @JoSerra... Мне нужно уехать из города, но я проверю это позже. Быть в курсе! - person MGoBlue93; 04.08.2017
comment
Спасибо, @JoSerra... Однако происходит что-то странное. Ваш сценарий находит 2 отсутствующих обновления, но загружает только одно из них: Поиск обновлений... Отсутствующие базы знаний: 1› 2017-07 Обновление безопасности для Adobe Flash Player для Windows 10 версии 1703 для систем на базе x64 (KB4025376) 2› 2017- 07 Накопительное обновление для Windows 10 версии 1703 для систем на базе x64 (KB4032188) - person MGoBlue93; 04.08.2017
comment
Загрузка обновлений... URL: download.windowsupdate.com/d/msdownload/update/software/secu/ c:\Users\dogzilla\Desktop\joserra.vbs(28, 4) (null): 0x80248007 - person MGoBlue93; 04.08.2017
comment
Чтобы запустить эти сценарии, вы должны использовать привилегию повышения прав (параметр «Запуск от имени администратора») или запустить 0x80248007. Отсутствующие обновления, возможно, связаны с критериями выбора IsInstalled=0 AND Type='Software' AND IsHidden=0 ? Попробуйте другой выбор. - person JoSerra; 05.08.2017
comment
Это не так - я запускал от имени администратора. Удалось ли вам узнать, какие параметры (например, IsInstalled, IsInstalled, IsHidden и т. д.) доступны? Я просмотрел API CreateUpdateDownloader на TechNet, и в нем не было списка параметров/аргументов. Спасибо! - person MGoBlue93; 11.08.2017
comment
@MGoBlue93 проверьте синтаксис поиска - person JoSerra; 14.08.2017