Назад | Перейти на главную страницу

Заблокировать конкретное исправление Центра обновления Windows

Я бы хотел оставить автоматическое обновление Windows включенным, но заблокировать установку определенного патча, который вызывает у нас проблемы.

Это возможно? Кто-нибудь знает, как это сделать?

Как указал DanBig, в более крупной сети вы захотите использовать WSUS. Однако, если вы хотите заблокировать отдельное оперативное исправление, вы можете сделать это с идентификатором оперативного исправления, используя этот сценарий:

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

Если обновление не связано со статьей базы знаний, вам нужно будет найти идентификатор обновления с помощью этого сценария:

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, потому что хотел взаимодействовать с агентом обновления Windows до установки PoSH. API Центра обновления Windows задокументировано в MSDN.

Если вы используете WSUS, вы можете отклонить обновление. Я не знаю, как это сделать иначе.

В приложении Windows Update (в Vista и 7) щелкните правой кнопкой мыши обновление, которое вы хотите заблокировать, и выберите «Скрыть обновление». Это удалит его из списка и заблокирует установку во время автоматической установки. Вы можете «восстановить» скрытое обновление в любое время в будущем, чтобы оно снова появилось в списке.

Аналогичный процесс существует на более старом веб-сайте Центра обновления Windows (для Windows XP), где вы можете скрыть обновление. Однако вариант сделать это находится в другом месте.

Я рекомендую однострочное изменение скриптов Колина. Я не совсем уверен, почему, но обнаружил, что вижу неправильный номер КБ, если я не использую такой поиск, как:

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

Если я укажу только IsInstalled = 0, я иногда получу другой номер КБ.

Например: 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 запутался.