我想保持 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 搞混了。