Windows update downloader.Download() fail

Deadly 提交于 2019-12-08 05:44:36

问题


I come across a sample vbscript program from Microsoft site regarding Windows Update(named 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

his script runs well until it reaches

downloader.Download()

On that line, the CMD window outputs

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

By adding a printf line before downloader.Download() , I can see that the error is asserted immediately in Download().

My question is: How can I find clue to know the error reason? May be there is way to catch the exception and let output some detailed error message.

I tried with the help of this post( Seem like a VBscript exception, how to cope with? ), and write around the problem line:

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

But WScript.Echo Err.Description outputs nothing. How can I do?

My environment: Windows 7 32-bit.

[[[ UPDATE ]]]

I'm back on this question. I've updated my script to use JScript. Yes, it is convenient than VBScript.

Now I have such code snippet:

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)
}

Remaining question is: How do I get error code from Download() so that I can check error reason. The page at http://msdn.microsoft.com/en-us/library/windows/desktop/aa386134%28v=vs.85%29.aspx seems too coarse for me to find the answer.

Waiting for your help again. Thank you.


回答1:


You are receiving this error because the Windows Updater API requires elevated priveleges. Launching your script in an elevated command prompt should solve the issue.

As a side note, you should make sure that you are connected to the internet, the Windows Update service is enabled, and that there are no pending update installations (i.e. waiting to install at shutdown). These things will also cause errors.

[edit]

You should be able to retrieve the status from inside the the library. The Download method returns a status code. Assigning its result to a variable may prevent your script from bombing out. If not, try using On Error Goto Next to get around it. You can find the various result codes and error codes below.

Windows Update Agent Result Codes

WUA Networking Error Codes



来源:https://stackoverflow.com/questions/9740694/windows-update-downloader-download-fail

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!