Просматривая в очередной раз журналы событий на серверах, я наконец решил взяться за массовые ошибки от WSUS, которые у нас возникают чуть ли не на каждом втором сервере. Вот как выглядела эта неприятность:

В массе своей ошибки сообщали о невозможности извлечь информацию из какого-нибудь счётчика сервера WSUS, например :

Log Name:      Operations Manager
Source:        Health Service Modules
Date:          24.03.2014 15:41:10
Event ID:      10102
Task Category: None
Level:         Warning
Keywords:      Classic
User:          N/A
Computer:      sql01.domain.int
Description:
In PerfDataSource, could not resolve counter WSUS: Reporting Web Service, Computer status rollups received, . Module will not be unloaded.

One or more workflows were affected by this.

Workflow name: Microsoft.Windows.Server.UpdateServices.2012.Server.PerformanceCollection.

ReportingWebService.Computerstatusrollupsreceived
Instance name: WSUS
Instance ID: {409F1F3C-B8ED-FB6C-42F0-F28F1904E470}

Что в общем-то неудивительно, потому что подобные события регистрировались на серверах, которые к WSUS никакого отношения не имеют. Конечно на них нет таких счётчиков, неоткуда им там взяться. Дальше я решил посмотреть, зачем SCOM пытается вытаскивать с этих серверов счётчики WSUS. Не потому ли, что он принял их за серверы с ролью WSUS? И правда, соответствующий список в консоли SCOM оказался битком набит лишними сервера.

При этом в пакете управления для WSUS 2012 R2 такого безобразия не наблюдалось, там в списке серверов WSUS были только серверы WSUS и ничего лишнего. Дальше дело техники. Явно дело в дискаверах. Дискавер для WSUS 2012 R2 работает корректно, а для WSUS 2012 допускает массу ложных срабатываний. Посмотрим прямо из оперативной консоли, что там внутри дискаверов.

Дискавер для WSUS 2012:

Не всё так сложно, как может показаться на первый взгляд. Дискавер ищет в реестре ключ “SOFTWARE\Microsoft\Update Services\Server\Setup\Version”, и если там значение “4″, то SCOM считает, что на этом сервере проинсталлирована серверная роль WSUS. 4 – это версия WSUS, вероятно.

К сожалению, этот путь и этот ключ есть не только на сервере WSUS, но и на любой машине с оснасткой для управления WSUS. Оснастка эта входит в комплект RSAT (набор оснасток для управления серверными ролями), а этот комплект у нас установлен на всех серверах. Вот дискавер и срабатывает на всех серверах с Windows 2012, принимая их за WSUS. Дальше SCOM пытается опрашивать уникальные для WSUS счётчики, что и приводит к ошибкам в журналах событий.

Следующий шаг – посмотреть дискавер для WSUS 2012 R2 и понять, почему, там нет ложных срабатываний.

Тут логика чуть посложнее.

Дискавер считает, что на сервере проинсталлирован WSUS если одновременно выполняются 2 условия:

  1. ключ по пути “SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion” равен 6.3 (проверка, что Windows Server версии 2012 R2),
  2. ключ по пути “SOFTWARE\Microsoft\Update Services\Server\Setup\Installed Role Services\UpdateServices-Services” равен 2 (проверка, что установлена серверная роль WSUS).

Чтобы проверить справедливость пункта 2 для WSUS 2012 поищем эти ключи реестра на сервере, где установлена только оснастка управления WSUS:

Такого ключа нет.

А теперь посмотрим на сервере WSUS:

Ключ есть.

Итак, остались сущие мелочи, скопировать работющую логику из дискавера WSUS 2012 R2 в дискавер WSUS 2012. Для начала экспортируем оба пакета управления. Для этого из консоли Operations Management Shell выполняем команду:

Get-SCManagementPack | where {$_.name -like “*UpdateServices*”} | Export-SCManagementPack -path “c:\temp\”

В папке c:\temp (её нужно предварительно создать) у нас должны появиться 2 файла:

  1. Microsoft.Windows.Server.UpdateServices.2012.xml
  2. Microsoft.Windows.Server.UpdateServices.2012.R2.xml

Наша задача подсмотреть во втором файле дополнительное условие дискавера и внести его в первый файл. Открываем файл Microsoft.Windows.Server.UpdateServices.2012.xml, находим там нужный дискавер и для начала копируем в раздел “RegistryAttributeDefinition” опрос ключа реестра “SOFTWARE\Microsoft\Update Services\Server\Setup\Installed Role Services\UpdateServices-Services” из аналогичного места в файле Microsoft.Windows.Server.UpdateServices.2012.R2.xml.

Было:

<AttributeType>1</AttributeType>
</RegistryAttributeDefinition>
<RegistryAttributeDefinition>
<AttributeName>ContentDir</AttributeName>
<Path>SOFTWARE\Microsoft\Update Services\Server\Setup\ContentDir</Path>
<PathType>1</PathType>
<AttributeType>1</AttributeType>
</RegistryAttributeDefinition>
</RegistryAttributeDefinitions>

Стало (добавленный код выделен жирным):

<AttributeType>1</AttributeType>
</RegistryAttributeDefinition>
<RegistryAttributeDefinition>
<AttributeName>ContentDir</AttributeName>
<Path>SOFTWARE\Microsoft\Update Services\Server\Setup\ContentDir</Path>
<PathType>1</PathType>
<AttributeType>1</AttributeType>
</RegistryAttributeDefinition>
<RegistryAttributeDefinition>
<AttributeName>WsusRole</AttributeName>
<Path>SOFTWARE\Microsoft\Update Services\Server\Setup\Installed Role Services\UpdateServices-Services</Path>
<PathType>1</PathType>
<AttributeType>2</AttributeType>
</RegistryAttributeDefinition>
</RegistryAttributeDefinitions>

Теперь меняем условие с проверки одного атрибута на проверку двух атрибутов.

Было:

 <Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>Values/Version</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>4</Value>
</ValueExpression>
</SimpleExpression>
</Expression>

Стало (добавленный код выделен жирным):

<Expression>
<And>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>Values/Version</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>4</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>Values/WsusRole</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>2</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</And>
</Expression>

Сохраняем изменения в файл Microsoft.Windows.Server.UpdateServices.2012.xml . Удаляем из SCOM пакет управления “Microsoft Windows Server Update Services 2012″. Импортируем наш изменённый xml и ждём пока отработает дискавер с исправленной логикой.

Ура! В списке серверов WSUS ничего лишнего:

Нужно ли говорить, что многочисленные ошибки из журналов событий тоже исчезли.

Для самых ленивых выкладываю готовый к употреблению исправленный пакет управления в xml.

Microsoft.Windows.Server.UpdateServices.2012