Каковы критерии, которые Windows использует для отображения количества обновлений?

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

Например, мой скрипт может вернуть:
Критический счетчик: 0
Важный счетчик: 1
Необязательный счетчик: 30

Но Центр обновления Windows сообщит, что есть:
Критический счетчик: 1
Важный счетчик: 1
Необязательный счетчик: 29

Кто-нибудь знает, какие критерии использует Windows для отображения счетчиков в Центре обновления Windows?
Вот пример моего кода:

# ----- Get All Assigned updates --------
$UpdateSession = New-Object -ComObject "Microsoft.Update.Session"
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
$SearchResult = $UpdateSearcher.Search('IsInstalled=0')

# ----- Matrix Results for type of updates that are needed --------
$critical = $SearchResult.updates | where { $_.MsrcSeverity -eq "Critical" }
$important = $SearchResult.updates | where { $_.MsrcSeverity -eq "Important" }
$optional = $SearchResult.updates | where { ($_.MsrcSeverity -ne "Critical") -and ($_.MsrcSeverity -ne "Important") }



person Eskimo    schedule 09.03.2012    source источник


Ответы (2)


Попробуйте запустить это, не уверен, решит ли это ваши проблемы или нет. У меня нет доступного банкомата powershell.

#Get All Assigned updates in $SearchResult
$UpdateSession = New-Object -ComObject Microsoft.Update.Session
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
$SearchResult = $UpdateSearcher.Search("IsAssigned=1 and IsHidden=0 and IsInstalled=0")


#Matrix Results for type of updates that are needed
$Critical = $SearchResult.updates | where { $_.MsrcSeverity -eq "Critical" }
$important = $SearchResult.updates | where { $_.MsrcSeverity -eq "Important" }
$other = $SearchResult.updates | where { $_.MsrcSeverity -eq $null }

#Write Results
Write-Host "total=$($SearchResult.updates.count)"
Write-Host "critical=$($Critical.count)"
Write-Host "important=$($Important.count)"
Write-Host "other=$($other.count)"
person Michael Stramel    schedule 09.03.2012
comment
Майкл. Я использовал ваш код в том виде, в котором он был, и не смог получить возврат для критического, важного и прочего. Я взял критерии поиска и $_.MsrcSeverity -eq $null и использовал их в своем коде, но результаты не соответствовали тому, что вернула Windows. Мой код: C=0,I=0,O=31 Windows возвращает C=0,I=1,O=30. Единственное обновление, о котором сообщается, что мой код отличается от Windows, — это обновление KB2600217, которое указано, но не отмечено в разделе «Важно». Любые другие идеи? - person Eskimo; 13.03.2012
comment
@Eskimo Извините, я мало что знаю об этом предмете. Вот несколько ссылок, которые могут быть полезны. blogs.technet. com/b/jamesone/archive/2009/01/27/ richardspowershellblog.wordpress.com/2011/06/12/ blogs.technet.com/b/heyscriptingguy/archive/2012/01/20/ - person Michael Stramel; 21.03.2012

Это старый пост, но я поделюсь тем, что нашел при решении этой проблемы, в надежде, что другие могут найти его полезным.

Такое поведение является результатом того, что PowerShell не возвращает массив/коллекцию, когда один объект возвращается из предложения WHERE. На снимке экрана ниже я провел тест с использованием аналогичного кода и разбил его по уровням MsrcSeverity. В некатегоризированной серьезности было одно обновление, но PowerShell вернул нулевое значение, когда я попытался получить количество.

Вы также можете видеть, что, вызывая переменную $uncategorizedupdates, я получаю фактическое обновление, а не коллекцию.

Скриншот вывода

Чтобы решить эту проблему, все, что нам нужно сделать, это явно определить нашу переменную как [массив], и тогда она вернет набор объектов, даже если присутствует только один объект. Просто измените свой код, как показано ниже....

[array]$critical = $SearchResult.updates | where { $_.MsrcSeverity -eq "Critical" }
[array]$important = $SearchResult.updates | where { $_.MsrcSeverity -eq "Important" }
[array]$optional = $SearchResult.updates | where { ($_.MsrcSeverity -ne "Critical") -and ($_.MsrcSeverity -ne "Important") }

Я воспроизвел это и в Windows 10, так что это все еще проблема даже в PowerShell 5. Надеюсь, это будет полезно.

person Donald    schedule 23.10.2017