Загрузчик обновлений Windows. Ошибка загрузки ()

Я наткнулся на образец программы vbscript с сайта Microsoft, касающийся Центра обновления Windows (с именем WUA_SearchDownloadInstall.vbs).

http://msdn.microsoft.com/en-us/library/aa387102%28VS.85%29.aspx

Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateupdateSearcher()

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

Set searchResult = _
updateSearcher.Search("IsInstalled=0 and Type='Software'")


WScript.Echo "List of applicable items on the machine:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> " & update.Title
Next

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

WScript.Echo vbCRLF & "Creating collection of updates to download:"

Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")

For I = 0 to searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> adding: " & update.Title 
    updatesToDownload.Add(update)
Next

WScript.Echo vbCRLF & "Downloading updates..."

Set downloader = updateSession.CreateUpdateDownloader() 
downloader.Updates = updatesToDownload
downloader.Download()

WScript.Echo  vbCRLF & "List of downloaded updates:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    If update.IsDownloaded Then
       WScript.Echo I + 1 & "> " & update.Title 
    End If
Next

Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")

WScript.Echo  vbCRLF & _
"Creating collection of downloaded updates to install:" 

For I = 0 To searchResult.Updates.Count-1
    set update = searchResult.Updates.Item(I)
    If update.IsDownloaded = true Then
       WScript.Echo I + 1 & "> adding:  " & update.Title 
       updatesToInstall.Add(update) 
    End If
Next

WScript.Echo  vbCRLF & "Would you like to install updates now? (Y/N)"
strInput = WScript.StdIn.Readline
WScript.Echo 

If (strInput = "N" or strInput = "n") Then 
    WScript.Quit
ElseIf (strInput = "Y" or strInput = "y") Then
    WScript.Echo "Installing updates..."
    Set installer = updateSession.CreateUpdateInstaller()
    installer.Updates = updatesToInstall
    Set installationResult = installer.Install()

    'Output results of install
    WScript.Echo "Installation Result: " & _
    installationResult.ResultCode 
    WScript.Echo "Reboot Required: " & _ 
    installationResult.RebootRequired & vbCRLF 
    WScript.Echo "Listing of updates installed " & _
     "and individual installation results:" 

    For I = 0 to updatesToInstall.Count - 1
        WScript.Echo I + 1 & "> " & _
        updatesToInstall.Item(i).Title & _
        ": " & installationResult.GetUpdateResult(i).ResultCode         
    Next
End If

его скрипт работает хорошо, пока не достигает

downloader.Download()

В этой строке окно CMD выводит

C:\wu-install\WUA_SearchDownloadInstall.vbs(37, 1) (null): 0x80240044

Добавив строку printf перед downloader.Download() , я вижу, что ошибка сразу подтверждается в Download().

Мой вопрос: как я могу найти ключ, чтобы узнать причину ошибки? Может быть, есть способ поймать исключение и позволить вывести подробное сообщение об ошибке.

Я попытался с помощью этого поста ( Похоже на исключение VBscript, как с ним справиться? ) и написать вокруг проблемная строка:

On Error Resume Next 
downloader.Download()
If Err.Number <> 0 Then
    WScript.Echo Err.Description
    WScript.Quit 4
End If
On Error Goto 0

Но WScript.Echo Err.Description ничего не выводит. Как я могу сделать?

введите здесь описание изображения

Моя среда: Windows 7 32-битная.

[[[ ОБНОВИТЬ ]]]

Я вернулся к этому вопросу. Я обновил свой скрипт, чтобы использовать JScript. Да, это удобнее, чем VBScript.

Теперь у меня есть такой фрагмент кода:

var downloader = updsession.CreateUpdateDownloader() 
downloader.Updates = updatesToDownload
try {
    downloader.Download()
}
catch(err) {
    WScript.Echo("Oops, Download error.")
    WScript.Echo("Possible reason:")
    WScript.Echo("* On Windows Vista/7, This requires you Run as Administrator.")
    WScript.Quit(3)
}

Остался вопрос: как мне получить код ошибки из Download(), чтобы я мог проверить причину ошибки. Страница по адресу http://msdn.microsoft.com/en-us/library/windows/desktop/aa386134%28v=vs.85%29.aspx кажется мне слишком грубым, чтобы найти ответ.

Жду вашей помощи снова. Спасибо.


person Jimm Chen    schedule 16.03.2012    source источник
comment
Я настоятельно рекомендую вам начать новый вопрос вместо того, чтобы редактировать этот. Ваш первоначальный вопрос уже рассмотрен. Вы можете включить ссылку на этот вопрос в качестве справочной информации.   -  person Cheran Shunmugavel    schedule 26.06.2012


Ответы (1)


Вы получаете эту ошибку, потому что API Windows Updater требует повышенных прав. Запуск скрипта в командной строке с повышенными привилегиями должен решить проблему.

В качестве примечания вы должны убедиться, что вы подключены к Интернету, служба Центра обновления Windows включена и что нет ожидающих установки обновлений (т.е. ожидающих установки при завершении работы). Эти вещи также будут вызывать ошибки.

[редактировать]

Вы должны иметь возможность получить статус из библиотеки. Метод Download возвращает код состояния. . Присвоение результата переменной может предотвратить сбой вашего скрипта. Если нет, попробуйте использовать On Error Goto Next, чтобы обойти это. Вы можете найти различные коды результатов и коды ошибок ниже.

Коды результатов агента Центра обновления Windows

Коды сетевых ошибок WUA

person Nilpo    schedule 17.03.2012
comment
Спасибо. Ты прав. Запуск от имени администратора на Win7 решает эту проблему. Но было бы лучше, если бы программа предоставляла способ сообщить пользователю, что вызвало эту ошибку. Если нет, мы должны проверить один за другим, какой из 3+ случаев встречается. - person Jimm Chen; 18.03.2012
comment
Правильный сценарий будет проверять все три экземпляра, чтобы быть тщательным. Однако эта конкретная ошибка возникает только из-за отсутствия повышенных привилегий. - person Nilpo; 18.03.2012
comment
А что насчет того, что в будущем будет четвертый? Должен быть способ получить описание ошибки из библиотеки. - person Jimm Chen; 20.03.2012