阻止特定的 Windows 更新修补程序

阻止特定的 Windows 更新修补程序

我想保持 Windows 自动更新处于启用状态,但阻止安装给我们带来问题的特定补丁。

这可能吗?有人知道怎么做吗?

答案1

DanBig 指出,在较大的网络中,您需要使用 WSUS。但是,如果您想要阻止单个热修复,可以使用此脚本通过热修复 ID 执行此操作:

If Wscript.Arguments.Count = 0 Then
    WScript.Echo "Syntax: HideWindowsUpdate.vbs [Hotfix Article ID]" & vbCRLF & _
                 "Examples:" & vbCRLF & _
                 "  - Hide KB940157: HideWindowsUpdate.vbs 940157"
    WScript.Quit 1
End If

Dim hotfixId
hotfixId = WScript.Arguments(0)

Dim updateSession, updateSearcher
Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateUpdateSearcher()

Wscript.Stdout.Write "Searching for pending updates..." 
Dim searchResult
Set searchResult = updateSearcher.Search("IsInstalled=0")

Dim update, kbArticleId, index, index2
WScript.Echo CStr(searchResult.Updates.Count) & " found."
For index = 0 To searchResult.Updates.Count - 1
    Set update = searchResult.Updates.Item(index)
    For index2 = 0 To update.KBArticleIDs.Count - 1
        kbArticleId = update.KBArticleIDs(index2)
        If kbArticleId = hotfixId Then
            WScript.Echo "Hiding update: " & update.Title
            update.IsHidden = True
        End If        
    Next
Next

如果更新未链接到 KB 文章,则需要使用以下脚本查找更新 ID:

Dim updateSession, updateSearcher
Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateUpdateSearcher()

Wscript.Stdout.Write "Searching for pending updates..." 
Dim searchResult
Set searchResult = updateSearcher.Search("IsInstalled=0")

Dim update, kbArticleId, index, index2
WScript.Echo CStr(searchResult.Updates.Count) & " found."
For index = 0 To searchResult.Updates.Count - 1
    Set update = searchResult.Updates.Item(index)
    WScript.Echo update.Identity.UpdateID & ": " & update.Title
Next

并使用此脚本阻止它:

If Wscript.Arguments.Count = 0 Then
    WScript.Echo "Syntax: HideWindowsUpdateById.vbs [Update ID]" & vbCRLF & _
                 "Examples:" & vbCRLF & _
                 "  - Hide KB940157: HideWindowsUpdateById.vbs 2ba85467-deaf-44a1-a035-697742efab0f"
    WScript.Quit 1
End If

Dim updateId
updateId = WScript.Arguments(0)

Dim updateSession, updateSearcher
Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateUpdateSearcher()

Wscript.Stdout.Write "Searching for pending updates..." 
Dim searchResult
Set searchResult = updateSearcher.Search("UpdateID = '" & updateId & "'")

Dim update, index
WScript.Echo CStr(searchResult.Updates.Count) & " found."
For index = 0 To searchResult.Updates.Count - 1
    Set update = searchResult.Updates.Item(index)
    WScript.Echo "Hiding update: " & update.Title
    update.IsHidden = True
Next

您也可以在 Windows PowerShell 中执行上述所有操作。我最初在 VBScript 中创建了脚本,因为我想在安装 PoSH 之前与 Windows Update Agent 进行交互。Windows Update API 是MSDN 上有记录

答案2

如果你正在使用微软,您可以拒绝更新。我不知道还有其他方法可以做到这一点。

答案3

在 Windows 更新应用程序(Vista 和 7 上)中,右键单击要阻止的更新并选择“隐藏更新”。这会将其从列表中删除,并在自动安装期间阻止安装。您可以在将来的任何时候“恢复”隐藏的更新,以便它重新出现在列表中。

旧版 Windows Update 网站(适用于 Windows XP)上有一个类似的流程,您可以在其中隐藏更新。不过,执行此操作的选项位于不同的地方。

答案4

我建议对 Colin 的脚本进行一行更改。我不确定具体原因,但我发现除非我使用类似以下搜索,否则我会看到错误的 KB 编号:

updateSearcher.Search("IsInstalled=0 and IsHidden=0")

如果我只指定 IsInstalled=0,我有时会得到不同的 KB 编号。

例如:KB2956078 已准备好安装在我的计算机上。如果我将两个条件都指定给 Search(),则会看到:

.Title = Security Update for Microsoft Outlook 2010 (KB2956078) 32-Bit Edition

但是,仅使用“IsInstalled=0”条件,我看到:

.Title = Security Update for Microsoft Outlook 2010 (KB4011273) 32-Bit Edition

查看 Windows 更新,我发现显示的是 KB2956078 更新。此外,我将该更新设置为隐藏,并且运行正常,并隐藏了我建议的更改的更新。

小更新:我可能已经弄清楚为什么会发生这种情况。我一直在抑制某些破坏 Outlook 脚本的 Outlook 更新。这两个更新的标题非常相似,看来 Windows Update 搞混了。

相关内容