<?xml version="1.0" encoding="UTF-8" ?><oembed><version>1.0</version><provider_name>Чудо{вищные} заметки</provider_name><provider_url>https://miracle.rpz.name</provider_url><author_name>MiRacLe</author_name><author_url>https://miracle.rpz.name/author/miracle/</author_url><title>Zabbix Low Level Discovery служб в локализованной Windows</title><html>&lt;a href=&quot;https://www.zabbix.com/documentation/2.0/ru/manual/discovery/low_level_discovery&quot;&gt;LLD&lt;/a&gt; в zabbix появился уже давно, но попытки в лоб использовать &lt;a href=&quot;http://blog.zabbix.com/low-level-discovery-for-windows-services/1867/&quot;&gt;готовые примеры для &quot;шаблонизации&quot; мониторинга служб на windows&lt;/a&gt; заканчивались неуспехами.

Недавно нашлись время, новые windows-машины и желание таки разобраться почему LLD не заводился. Ответ уже написан в названии поста - локализованные винды, non-ascii символы в названиях и описаниях служб.

Итак проблема - на целевой windows-машине необходимо собрать JSON-объект вида &lt;code&gt;{data: [{&quot;#SERVICENAME&quot;: &quot;Бугага&quot;, &quot;#SERVICEDISPLAY&quot;: &quot;Не служба, а дружба&quot;, ....}]}&lt;/code&gt; подручными средствами.

Подручным средством был выбран powershell - с ним недавно пришлось познакомиться поближе, остались приятные впечатления.

Авторы традиционных (распространнёных в сети) решений данной задачи во-первых живут в идеальном en-US мире, но видимо вынуждены поддерживать весьма большой зоопарк версий &lt;em&gt;этой&lt;/em&gt; системы. Поэтому json они собирают вручную, но с кодировкой проблем не имеют. Мне же музейные версии powershell поддерживать не нужно, поэтому решение получилось простым и лаконичным: &lt;!--more--&gt;установить правильную кодировку и воспользоваться встроенным json-конвертером.

Сохраняем servicediscovery.ps1:
&lt;pre class=&quot;php&quot;&gt;[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

$services = Get-WmiObject Win32_Service | where-object { $_.StartMode -eq &#039;Auto&#039; } | Select-Object -Property @{Name=&quot;{#SERVICESTATE}&quot;; Expression = {$_.State}},@{Name=&quot;{#SERVICEDISPLAY}&quot;; Expression = {$_.DisplayName}},@{Name=&quot;{#SERVICENAME}&quot;; Expression = {$_.Name} },@{Name = &quot;{#SERVICEDESC}&quot;; Expression = {$_.Description}},@{Name = &quot;{#SERVICEDIR}&quot;; Expression = {$_.PathName}}

$zabbixLLD = @{data=$services} | ConvertTo-Json -Compress
[Console]::WriteLine( $zabbixLLD )
&lt;/pre&gt;
Добавляем в конфигурацию агента пользовательский параметр:

&lt;code&gt;UserParameter=service.discovery,powershell -File &quot;c:\zabbix\servicediscovery.ps1&quot;&lt;/code&gt;

Пробуем zabbix_get-ом получить результат:

&lt;code&gt;zabbix_get -s windows.host -k service.discovery&lt;code&gt;&lt;/code&gt;&lt;/code&gt;

В случае успеха получаем правильный json-объект, которым можно воспользоваться по прямому назначению - создать прототипы метрик и триггеров (в виде шаблона например, можно взять &lt;a href=&quot;https://raw.githubusercontent.com/q1x/zabbix-templates/master/service-discovery/Template_Windows_Service_Discovery.xml&quot;&gt;готовый&lt;/a&gt;).

Скрипт немного проверен на небольшом количестве русских версий windows от 7 до 2012, турецкой windows 2008r2 и ещё несколько европейских локализаций относительно свежих серверных версий &lt;em&gt;этой&lt;/em&gt; системы, судя по документации в MSDN ConvertTo-Json появился в powershell 3.0 (что видимо и является единственным требованием для корректной работы).</html><type>rich</type></oembed>