如何发现Windows Update是可选的,推荐的还是重要的

我目前正在写一种自动化程序,其中包括searchWindows更新。 它可以search和检索更新就好了,但我无法深入了解更新的优先级。 我想有一个输出类似于:

总计更新:25重要:12可选:13

.IsMandatory字段仅在更新专用于WUA本身时才使用,因此重要的更新不需要用.IsMandatory标记。

查找用水户协会的代码片段如下:

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 UPDATES-----@ " & 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 Dim imp_updates = 0 Dim opt_updates = 0 For i = 0 To results.Updates.Count - 1 Dim update = results.Updates.Item(i) If update.IsMandatory = False Then opt_updates = opt_updates + 1 Else imp_updates = imp_updates + 1 End If Next outputWriter.WriteLine("Important Updates: " & imp_updates, True) outputWriter.WriteLine("Optional Updates: " & opt_updates, True) 

Solutions Collecting From Web of "如何发现Windows Update是可选的,推荐的还是重要的"

事实证明,我没有在我的代码中引用WUApi.DLL。 一旦我把这个引用,我成功地能够把我的结果作为一个IUpdate3。 IUpdate3是一个包含名为BrowseOnly的属性的接口。 BrowseOnly所做的是指定更新是否可选。 使用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 UPDATES-----@ " & 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 Updates-----@ " & 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 

您应该能够检查更新的MsrcSeverity :

  Select Case update.MsrcSeverity Case "Important" Case "Critical" Case "Moderate" Case "Low" Case "Unspecified" End Select 

循环results.Updates.Count,然后检查每个Update.Item其Categories文件名称。

 For i As Integer = 0 To results.Updates.Count - 1 updateCategories = results.Updates.Item(i).Categories For j As Integer = 0 To updateCategories.Count - 1 updateCategorie = updateCategories.Item(j).Name Select Case updateCategorie Case "Updates" 'do something Case "Critical Updates" 'do something Case "Security Updates" 'do something Case "Service Packs" 'do something Case "Update Rollups" 'do something Case "Feature Packs" 'do something Case Else 'do something End Select Next Next