Несмотря на то, что по планете уже давно победно шествует Windows 2012 Server редакции R2, в отдельных хозяйствах ещё используется Windows 2012 Server SP1 (не R2), и по разным причинам перейти на R2 народ не спешит. Вот у одного из наших клиентов в роли терминального сервера оказалась Винда 2012 без возможности апгрейда.

Мониторингом роли Remote Desktop Services на Windows 2012 занимается пакет управления “Windows Server 2012 Remote Desktop Services Management Pack”. Для R2 был выпущен отдельный пакет управления “Windows Server 2012 R2 Remote Desktop Services”, который делает всё тоже самое, но для Windows Server 2012 R2. Отличаются пакеты управления не только поддерживаемой версией Windows Server, но и тем, что пакет управления для Windows Server 2012 глючит со страшной силой.

Во-первых, на мониторящемся терминальном сервере раз в 10 минут сыпется ошибка вида:

Log Name:      Operations Manager
Source:        Health Service Modules
Date:          14.03.2014 15:27:27
Event ID:      26004
Task Category: None
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      ts01.domain.int
Description:
The Windows Event Log Provider is still unable to open the Microsoft-Windows-RemoteDesktopServices-Gateway/Operational event log on computer ‘ts01.domain.int’. The Provider has been unable to open the Microsoft-Windows-RemoteDesktopServices-Gateway/Operational event log for 4320 seconds.

Most recent error details: The specified channel could not be found. Check channel configuration.

One or more workflows were affected by this.

Workflow name: UIGeneratedMonitor2afa761fe82d4ce0b77f1cf5d497261e
Instance name: Remote Desktop Gateway
Instance ID: {66D01E45-A8A9-7616-9E7C-FF4A170E2FAA}

Во-вторых, на серверах управления SCOM примерно каждые 10 минут возникает критическая ошибка следующего содержания:

Log Name:      Operations Manager
Source:        Health Service Modules
Date:          14.03.2014 7:50:59
Event ID:      31567
Task Category: Data Warehouse
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      scom01.domain.int
Description:
Failed to deploy reporting component to the SQL Server Reporting Services server. The operation will be retried.
Exception ‘DeploymentException’: Failed to deploy reports for management pack with version dependent id ‘c81d93be-218d-0d84-2fd8-c8c415b93be5′. Failed to deploy linked report ‘Report.Windows.Server.2012.RDSessionHostServerActiveAndInActiveConnectionsByDay’. Failed to convert management pack element reference ‘$MPElement[Name="Microsoft.Windows.Server.2012.RemoteDesktopServicesRole.Service. RDSessionHost.InactiveSessions.PerformanceCollection"]$’ to guid. Check if MP element referenced exists in the MP. Объект класса ManagementPackElement с ИД bcde77f3-211c-6a07-1272-47218344572f не найден.

One or more workflows were affected by this.

Workflow name: Microsoft.SystemCenter.DataWarehouse.Deployment.Report
Instance name: 4d63a663-29fb-44e4-8520-00ddcf47f824
Instance ID: {C76E59C2-279E-D1D3-3B9B-643D5E043F6F}

 

Попробуем разобраться с причинами этих ошибок и всё исправить. С первой ошибкой проще всего, явно в коде пакета управления происходит обращение к журналу Microsoft-Windows-RemoteDesktopServices-Gateway/Operational, которого в реальности нет на сервере. Правило (или монитор) пытается открыть этот журнал событий, чтобы найти в нём нужный код ошибки, журнала события нет, возникает критиеская ошибка в логе Operations Manager.

 

Судя по названию, имелся ввиду журнал Microsoft-Windows-TerminalServices-Gateway/Operational, он как раз на сервере существует. Вероятно, команда разработчиков из Microsoft производила автозамену “TerminalServices” на “RemoteDesktopServices” в коде пакета управления и, увлёкшись, заменила лишнее.

Исправить это проще простого. Для начала экспортируем пакет управления “Windows Server 2012 Remote Desktop Services Management Pack” – из консоли Operations Management Shell выполняем команду:

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

В директории c:\temp (её нужно предварительно создать) у нас оказался файл “Microsoft.Windows.Server.RemoteDesktopServices.2012.xml”. Открываем его любым текстовым редактором и заменяем Microsoft-Windows-RemoteDesktopServices-Gateway на Microsoft-Windows-TerminalServices-Gateway везде в тексте (а по факту всего в одном мониторе)

Было:

 <Configuration>
<ComputerName>$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<LogName>Microsoft-Windows-RemoteDesktopServices-Gateway/Operational</LogName>
<Expression>
<And>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type=”String”>Channel</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type=”String”>Microsoft-Windows-RemoteDesktopServices-Gateway/Operational</Value>
</ValueExpression>
</SimpleExpression>
</Expression>

Стало:

 <Configuration>
<ComputerName>$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<LogName>Microsoft-Windows-TerminalServices-Gateway/Operational</LogName>
<Expression>
<And>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type=”String”>Channel</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type=”String”>Microsoft-Windows-TerminalServices-Gateway/Operational</Value>
</ValueExpression>
</SimpleExpression>
</Expression>

Не спешим закрывать блокнот, нам ещё нужно исправить оставшуюся ошибку. Её источник – неверная ссылка отчёта на правило.

В тексте ошибки есть вся необходимая информация

Failed to deploy linked report ‘Report.Windows.Server.2012.RDSessionHostServerActiveAndInActiveConnectionsByDay’. Failed to convert management pack element reference ‘$MPElement[Name="Microsoft.Windows.Server.2012.RemoteDesktopServicesRole.Service. RDSessionHost.InactiveSessions.PerformanceCollection"]$’ to guid. Check if MP element referenced exists in the MP.

Перевожу на человеческий язык. Отчёт Report.Windows.Server.2012.RDSessionHostServerActiveAndInActiveConnectionsByDay пытается использовать данные, поступающие от правила “Microsoft.Windows.Server.2012.RemoteDesktopServicesRole.Service. RDSessionHost.InactiveSessions.PerformanceCollection”, но не может найти правило с таким именем.

Если вы поищете в коде пакета управления текст “Microsoft.Windows.Server.2012.RemoteDesktopServicesRole.Service. RDSessionHost.InactiveSessions.PerformanceCollection” то сами убедитесь – такого правила и правда нет. Но не будем отчаиваться, посмотрим, какие правила вообще есть в пакете управления.

И вуаля, вот это правило поразительно похоже на то, которое ищет отчёт, имя опрашиваемого счётчика как раз: Inactive Sessions. Только отчёт ссылается на правило, название которого набрано вручную понятным языком, а в коде у нас имя, сгенерированное автоматически оперативной консолью. Вероятно, правила делались командой разработчиков вручную, а отчёт был скопирован откуда-то из другого пакета управления, вот имена и разъехались.

<Rule ID=”MomUIGeneratedRule14cfcf0ddbd24e6b81a088655f8a3303” Enabled=”false” Target=”Microsoft.Windows.Server.2012.RemoteDesktopServicesRole.Service.RDSessionHost” ConfirmDelivery=”false” Remotable=”true” Priority=”Normal” DiscardLevel=”100″>
<Category>PerformanceCollection</Category>
<DataSources>
<DataSource ID=”PerformanceDS” TypeID=”SystemPerf!System.Performance.OptimizedDataProvider”>
<ComputerName>$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<CounterName>Inactive Sessions</CounterName>
<ObjectName>Terminal Services</ObjectName>
<InstanceName />
<AllInstances>false</AllInstances>
<Frequency>900</Frequency>
<Tolerance>5</Tolerance>
<ToleranceType>Percentage</ToleranceType>
<MaximumSampleSeparation>4</MaximumSampleSeparation>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID=”WriteToDB” TypeID=”SC!Microsoft.SystemCenter.CollectPerformanceData” />
<WriteAction ID=”WriteToDW” TypeID=”SCDW!Microsoft.SystemCenter.DataWarehouse.PublishPerformanceData” />
</WriteActions>
</Rule>

Исправить это несложно. Нужно автозаменой пройтись по тексту и заменить MomUIGeneratedRule14cfcf0ddbd24e6b81a088655f8a3303 на то, что ожидает отчёт: “Microsoft.Windows.Server.2012.RemoteDesktopServicesRole.Service. RDSessionHost.InactiveSessions.PerformanceCollection”. Когда я это проделал, попутно выяснилось, что в пакете управления есть ещё 2 отчёта по счётчикам Active Sessions и Total Sessions. Для них нужно проделать такую же процедуру автозамены.

После этого нужно удалить из SCOM пакет управления “Windows Server 2012 Remote Desktop Services Management Pack” и импортировать изменённый нами xml и посмотреть, исчезнут ли ошибки. В моём случае ошибки из журналов пропали. А в списке отчётов появилась папка “Windows Server 2012 Remote Desktop Services”, и в ней 3 отчёта. Ура!

На всякий случай прилагаю исправленный пакет управления в xml.

Microsoft.Windows.Server.RemoteDesktopServices.2012