Я бы хотел оставить автоматическое обновление 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 запутался.