2014-09-29 45 views
0

我正在嘗試檢索Windows Update搜索結果,它們的類型爲IUpdate從ISearchResult(Windows Update搜索)訪問IUpdate2,3,4或5

但是,我想要的屬性不是IUpdate接口的一部分。我想要的財產(BrowseOnly)位於IUpdate3界面內。

我的問題是,如何從包含IUpdate的搜索結果中訪問IUpdate3接口中的屬性?或者我可以改變搜索返回的界面嗎?

+1

我從MSDN文檔看到'IUpdate3'從'IUpdate'繼承(通過'IUpdate2')。你有沒有嘗試投射到「IUpdate3」?顯示您的搜索代碼可能有幫助。 – Vache 2014-09-29 19:53:34

回答

0

事實證明,我沒有在我的代碼中引用WUApi.DLL。一旦我將該引用放入,我成功地將我的結果作爲IUpdate3進行投射,這使我可以訪問BrowseOnly字段。

見下文(IUpdate3使用周圍的代碼塊的中間)...

''' <summary> 
''' Performs a windows update check for any updates that are... 
''' A: Not installed 
''' B: Not hidden 
''' C: Software updates (OS and software, no hardware updates) 
''' </summary> 
''' <returns>0 on success, 1 on failure</returns> 
''' <remarks></remarks> 
Function checkForUpdates() As Integer 

    Dim updateSession ' Object to hold our MS Update Session 
    Dim updateSearcher ' Object to perform our MS Win Update Search 
    Dim results  ' Object to hold our MS Win Update Search Results 
    Dim stopWatch As New Stopwatch() 
    stopWatch.Start() 

    outputWriter.WriteLine("----WINDOWS [email protected] " & Now, False) 
    outputWriter.WriteLine(" -We are beginning our update search. Please note, this may take a few minutes." & _ 
          " On Windows Server 2003 this may take 800 years.", False) 

    ' We cannot guarantee the update check will succeed, so use a try catch in case of error. 
    Try 
     updateSession = CreateObject("Microsoft.Update.Session") 
     updateSearcher = updateSession.CreateUpdateSearcher() 
     results = updateSearcher.Search("IsInstalled=0 and Type='Software' and IsHidden=0") 
    Catch ex As Exception 
     outputWriter.WriteLine(" ERROR: Something went wrong in our update search. Details below...", False) 
     outputWriter.WriteLine(" Error Msg: " & ex.Message, False) 
     Return 1 
    End Try 

    outputWriter.WriteLine(" -Windows update search has successfully completed. Beginning iteration of result set...", False) 

    ' Similar to above, we cannot guarantee iterating through our result set will succeed. Use a try catch. 
    Try 
     Dim totalUpdates = results.Updates.Count 
     outputWriter.WriteLine("-----Windows [email protected] " & Now, True) 
     If results.Updates.Count = 0 Then 
      outputWriter.WriteLine("Total Updates: 0", True) 
      outputWriter.WriteLine("Important:  0", True) 
      outputWriter.WriteLine("Optional:  0", True) 
     Else 
      Dim imp_updates = 0 
      Dim opt_updates = 0 
      For i = 0 To totalUpdates - 1 
       Dim update = results.Updates.Item(i) 
       If CType(update, WUApiLib.IUpdate3).BrowseOnly = True Then ' BrowseOnly is specifically used for whether an update is deemed optional or not (True for optional) 
        opt_updates = opt_updates + 1 
       Else 
        imp_updates = imp_updates + 1 
       End If 
      Next 

      outputWriter.WriteLine("Total Updates: " & totalUpdates, True) 
      outputWriter.WriteLine("Important:  " & imp_updates, True) 
      outputWriter.WriteLine("Optional :  " & opt_updates, True) 

     End If 
     stopWatch.Stop() 
     If stopWatch.ElapsedMilliseconds >= 1000 Then 
      outputWriter.WriteLine("--------Total Time: " & Math.Round((CDbl(stopWatch.ElapsedMilliseconds)/1000), 2) & " Sec----------------" & vbCrLf, True) 
     Else 
      outputWriter.WriteLine("--------Total Time: " & stopWatch.ElapsedMilliseconds & " MS-------------------" & vbCrLf, True) 
     End If 

    Catch ex As Exception 
     outputWriter.WriteLine(" ERROR: We encountered an issue while iterating through Windows Update Search Results. Details below...", False) 
     outputWriter.WriteLine(" Error Msg: " & ex.Message, False) 
     Return 1 
    End Try 

    outputWriter.WriteLine(" -Iteration of Windows Update Search Results has successfully completed.", False) 
    outputWriter.WriteLine("-------------------------" & vbCrLf, False) 

    ' Clean up our objects. 
    updateSession = Nothing 
    updateSearcher = Nothing 
    results = Nothing 

    ' Success! 
    Return 0 
End Function