4

我目前正在编写一种自动程序,其中包括搜索 Windows 更新。它可以很好地搜索和检索更新,但我无法深入了解更新的优先级。我想要一个类似于以下的输出:

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

.IsMandatory 字段仅在更新专门针对 WUA 本身时使用,因此无需使用 .IsMandatory 标记重要更新。

搜索 WUA 的代码片段如下:

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

3 回答 3

2

事实证明,我的代码中没有对 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
于 2014-09-30T12:58:50.973 回答
0

您应该能够检查更新的MsrcSeverity

    Select Case update.MsrcSeverity
        Case "Important"
        Case "Critical"
        Case "Moderate"
        Case "Low"
        Case "Unspecified"
    End Select
于 2014-09-26T18:42:38.367 回答
0

循环遍历 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
于 2015-05-07T06:09:34.540 回答