Сценарий обнаружения исправлений Windows

#windows #powershell #hotfix

#Windows #powershell #исправление

Вопрос:

Итак, недавно у нас возникли проблемы с обновлением KB971033 в нашей сети, и мне удалось получить рабочий скрипт для его удаления и повторной активации Windows, однако при попытке заставить скрипт обнаружения работать, чтобы убедиться, что он работает только на зараженных компьютерах, я не могу заставить его корректно выводить true или false при тестировании с установленными KBS.

Пока это то, что я запускаю. Независимо от того, что я делаю, выводится false. Чего-нибудь очевидного мне не хватает?

 if ((get-hotfix).hotfixid -eq "KB971033") {$true} else {$false}
  

Ответ №1:

(get-hotfix).hotfixid возвращает массив, поэтому вам не следует сравнивать его с -eq .

Это должно сработать:

 ((Get-HotFix  | Select-Object -ExpandProperty HotFixID) -contains 'KB971033')
  

или для краткости:

 (((Get-HotFix).HotFixID) -contains 'KB971033')
  

Комментарии:

1. Да, по какой-то причине это работает отлично, есть ли причина, по которой мой приведенный выше код будет нормально работать в серверной среде, но не на наших конечных компьютерах, но приведенный выше код работает нормально?

2.@benrpr Согласно документам, -eq возвращает значение TRUE или совпадения, если одно или несколько значений идентичны шаблону. следовательно, ((get-hotfix).hotfixid -eq "KB971033") должен возвращать массив из одного элемента, содержащий строку «KB971033». Однако, насколько я могу судить, это относится к PowerShell версии 3.0 и выше. В любом случае, я никогда не использую -eq при проверке значения в массиве. -contains , -in , -notcontains и -notin предназначены для этого.

Ответ №2:

ИМО довольно неэффективно просматривать все исправления при тестировании отдельного.

 if (Get-Hotfix -ID KB971033 -EA 0) {$true} else {$false}
  

-EA 0 это сокращение от -ErrorAction SilentlyContinue

Ответ №3:

Может быть, попробовать

  if ($(get-hotfix).hotfixid -eq "KB971033") {$true} else {$false}
  

«$» преобразует результат «Get-Hotfix» в объект с элементом «.HotFixID».

Комментарии:

1. Все еще выводя false при известном установленном обновлении, я начинаю думать, что проблема может заключаться в другом месте, и код на самом деле в порядке.

Ответ №4:

В моей среде Windows Server 2016 ваш код работает нормально … возможно, исправление не установлено или отсутствует в списке «get-hotfix»

В противном случае вы можете попробовать это:

 $HotfixID= "KB971033"
IF((get-hotfix).hotfixid | ?{ $_ -eq $HotfixID}){$true} else {$false}
  

Он работает также на удаленном компьютере:

 (get-hotfix).hotfixid -ComputerName "***SomeDNSName / FQDN***"
  

Комментарии:

1. Исправление установлено и отображается при get-hotfix автономном запуске. Обновленная версия скрипта по-прежнему выдает значение false