Задача: Хочу поставить на мониторинг Grace Period on Terminal Server

Предыстория: Есть терминальный сервер на базе Windows Server 2016 Standard именуемый, как srv-ts00-abc и он состоит в связки с сервисом Remote Desktop Gateway, но вот он у меня без возможности задействовать активацию на удаленное подключение, а потому я использую полнофункциональное использования сроком на 120 дней, когда дни подходят к отметке "0", то задействую заметку: "Дополнение как сбросить grace period TS Windows Server 2016". Исходя из этого у меня появилась следующая заметка, я хочу параметр GracePeriod поставить на мониторинг в Zabbix 5.0.9 который развернут на Ubuntu 18.04 Server. Если система выполняет тот функционал, который мне нужен, то смысл гнаться за чем-то более новым в плане новых версий. По принципу ниже и все остальные терминальные сервера будет добавлены в Zabbix.

Начнем…

Шаг №1: Проверка лицензии терминального сервера srv-ts00-host:

Login in srv-ts00-abc (Group: Domain Admins)

Win + X -> Command Prompt (Admin)

wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TerminalServiceSetting where (__CLASS !="") call getgraceperioddays | findstr /I "DaysLeft"

Шаг №2: На Терминальный сервер нужно установить Zabbix агент (zabbix_agent-5.0.9-windows-amd64-openssl.msi) со следующим конфигурационным файлом:

C:\Zabbix\zabbix_agentd.conf
LogFile=C:\Zabbix\zabbix_agentd.log
AllowKey=system.run[*]
LogRemoteCommands=1
Timeout=30
Server=srv-zabbix.polygon.local
Hostname=SRV-SHARES03
Include=C:\Zabbix\zabbix_agentd.conf.d\
#Include=C:\Zabbix\scripts\
UnsafeUserParameters=1
c:\Script>netstat -a | findstr /I :100
TCP    0.0.0.0:10050          edf:0                  LISTENING
TCP    [::]:10050             srv-ts00-abc:0         LISTENING

Шаг №3: Проверяем что с Zabbixсервера видим хост c Zabbixагентом:

На заметку: Синтаксис проверки

zabbix_get -s <host> -p <port:10050> -k <key>
ekzorchik@srv-zabbix:~$ zabbix_get -s 192.168.11.14 -p10050 -k system.uptime
zabbix_get [17739]: Get value error: ZBX_TCP_READ() failed: [104] Connection reset by peer
zabbix_get [17739]: Check access restrictions in Zabbix agent configuration
ekzorchik@srv-zabbix:~$

а в логах на Windows (C:\Zabbix\zabbix_agentd.log)

13916:20240802:083933.266 failed to accept an incoming connection: connection from "192.168.9.126" rejected, allowed hosts: "srv-zabbix.polygon.local"
9256:20240802:084033.276 failed to accept an incoming connection: connection from "192.168.9.126" rejected, allowed hosts: "srv-zabbix.polygon.local"

в этом случае и в своем случае мне нужно проверить а есть ли у меня правило на Mikrotik на доступ из сети где хост (это сеть 192.168.11.14) к Zabbix-серверу (srv-zabbix.polygon.local [192.168.9.126])

Т.к. на системе 192.168.11.14 нет внутреннего DNS то адрес серверу нужно указывать не по FQDN-имени, а указывать IP-адрес, изменил:

LogFile=C:\Zabbix\zabbix_agentd.log
AllowKey=system.run[*]
LogRemoteCommands=1
Timeout=30
Server=192.168.9.126
Hostname=SRV-TS00-ABC
Include=C:\Zabbix\zabbix_agentd.conf.d\
#Include=C:\Zabbix\scripts\
UnsafeUserParameters=1

После перезапускаю службу "Zabbix Agent"

С сервера Zabbix проверяю доступность:

ekzorchik@srv-zabbix:~$ zabbix_get -s 192.168.11.14 -p10050 -k system.uptime
5658698
ekzorchik@srv-zabbix:~$

и вот такое правило у меня на Mikrotik:

winbox - ip - user&pass - IP - Firewall — вкладка Filter Rules

  • Chain: forward
  • Protocol: 6(tcp)
  • Dst.Port: 10050
  • In.Interface: VLAN 11
  • Dst. Address List: srv-zabbix.polygon.local (192.168.9.126)
  • Action: Accept

и правило на проверку через ICMP:

winbox - ip - user&pass - IP - Firewall — вкладка Filter Rules

  • Chain: forward
  • Protocol: 1(icmp)
  • In.Interface: VLAN 11
  • Out. Interface: VLAN 9
  • Src. Address List: ! zabbix_host (192.168.11.14)
  • Dst. Address List: VLAN 9
  • Action: Drop

На заметку: в моем случае, сперва правило DROP, а потом Forward.

Шаг №4: Далее нужно на Zabbix сервере завести хост на Мониторинг и прикрутить к нему шаблоны:

http://IP&DNS/zabbix - user&pass - Настройка - Узлы сети - Создать узел сети

  • Имя узла сети: srv-ts00-abc
  • Группы: GROUP_WINDOWS
  • Интерфейсы:
    • IP адрес: 192.168.11.14
    • Подключаться через: IP
    • Порт: 10050
  • Наблюдение через прокси: (без прокси)
  • Активировано: Отмечаю галочкой
  • Присоединенные шаблоны: Templates/Operating system - Template OS Windows by Zabbix agent

На хост: srv-ts00-abc нацелен шаблон Template OS Windows by Zabbix agent

Шаг №5: Создаю шаблон с именем Template_Grace:

http://IP&DNS/zabbix - user&pass - Настройка - Шаблоны - Создать шаблон

вкладка "Шаблон"

  • Имя шаблона: Template_Grace
  • Группы: GROUP_WINDOWS

вкладка "Макросы"

  • Макрос: {$SRVTS00ABC}
  • Значение: 192.168.11.14

и нажимаю "Добавить".

На заметку: В этой реализации заметки во вкладе "Макросы" можно не создавать значения.

Шаг №6: После в созданном шаблоне (Template_Grace) создаю элемент данных:

http://IP&DNS/zabbix - user&pass - Настройка - Шаблоны — перехожу в шаблон "Template_Grace" и в "Элементы данных" нажимаю "Создать элемент данных"

вкладка "Элемент данных"

  • Имя: Grace
  • Тип: Zabbix агент
  • Ключ: graceperiod
  • Тип информации: Текст
  • Интервал обновления: 1d
  • Пользовательские интервалы: Переменный
  • Период хранения истории: Период хранения 90d
  • Новая группа элементов данных: GracePeriod
  • Заполнение поля инвентаря узла сети: Нет
  • Активировано: Отмечаю галочкой

вкладка "Предобработка"

(Шаги предобработки) — нажимаю "Добавить"

  • Имя: Обрезать справа
  • Параметры: ;

и нажимаю "Добавить"

На заметку: Но я бы посоветовал покуда отлаживаете собственные шаблоны не лишим будет использовать переход в "Тест"

ниже пример как это выглядит

Предобработка ключа graceperiod в Zabbix

Шаг №7: Если на Windows (srv-ts00-abc) при проверке выполнения ключа (Элемент данных с именем graceperiod) ошибка:

c:\Zabbix>zabbix_get.exe -s 127.0.0.1 -p 10050 -k graceperiod
zabbix_get.exe [7244]: Get value error: ZBX_TCP_READ() failed: [0x00002746] An existing connection was forcibly closed by the remote host.
zabbix_get.exe [7244]: Check access restrictions in Zabbix agent configuration

нужно в C:\Zabbix\zabbix_agentd.conf в параметр Server добавить 127.0.0.1 тем самым мы даем понять, что обращаться к элементам данных можем с самой Windows системы:

LogFile=C:\Zabbix\zabbix_agentd.log
AllowKey=system.run[*]
LogRemoteCommands=1
Timeout=30
Server=192.168.9.126,127.0.0.1
Hostname=SRV-TS00-ABC
Include=C:\Zabbix\zabbix_agentd.conf.d\
#Include=C:\Zabbix\scripts\
UnsafeUserParameters=1
UserParameter=graceperiod,wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TerminalServiceSetting where (__CLASS !="") call getgraceperioddays | findstr /I "DaysLeft"
net stop "Zabbix Agent" && net start "Zabbix Agent"

Проверяю и вот результат:

c:\Zabbix>zabbix_get.exe -s 127.0.0.1 -p 10050 -k graceperiod
DaysLeft = 54;

Изменил на вот так

LogFile=C:\Zabbix\zabbix_agentd.log
AllowKey=system.run[*]
LogRemoteCommands=1
Timeout=30
Server=192.168.9.126,127.0.0.1
Hostname=SRV-TS00-ABC
Include=C:\Zabbix\zabbix_agentd.conf.d\
#Include=C:\Zabbix\scripts\
UnsafeUserParameters=1
#UserParameter=graceperiod,wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TerminalServiceSetting where (__CLASS !="") call getgraceperioddays | findstr /I "DaysLeft"
UserParameter=graceperiod,C:\Zabbix\Scripts\graceperiod.bat

где содержимое bat файла:

rem @echo off
set strGraceResult = C:\Zabbix\Scripts
wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TerminalServiceSetting where (__CLASS !="") call getgraceperioddays | findstr /I "DaysLeft" > %strGraceResult%\grace.txt
for /f "tokens=3" %%g in (%strGraceResult%\grace.txt) do echo %%g
c:\Zabbix>zabbix_get.exe -s 127.0.0.1 -p 10050 -k graceperiod
54;
c:\Zabbix>
ekzorchik@srv-zabbix:~$ zabbix_get -s 192.168.11.14 -p10050 -k graceperiod
54;
ekzorchik@srv-zabbix:~$

На заметку: Когда все будет в боевом, то в graceperiod.bat нужно вместо rem @echo off сделать echo off

На заметку: Содержимое скрипта graceperiod.bat

@echo off
set strGraceResult = C:\Zabbix\Scripts
wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TerminalServiceSetting where (__CLASS !="") call getgraceperioddays | findstr /I "DaysLeft" > %strGraceResult%\grace.txt
for /f "tokens=3" %%g in (%strGraceResult%\grace.txt) do echo %%g

На заметку: Я средствами Zabbix буду удалять символ точки с запятой, см. шаги выше, как я это делаю.

Шаг №8: Проверяю, что у узла сети srv-ts00-abc присоединен шаблон Template_Grace или присоединяю:

http://IP&DNS/zabbix - user&pass - Настройка - узлы сети — перехожу в узел srv-ts00-abc, вкладка "Шаблоны" и добавляю шаблон "Template_Grace", после принудительно командую получение значения Grace:

http://IP&DNS/zabbix - user&pass - Настройка - Узлы сети — перехожу в узел srv-ts00-abc, перехожу в "Элементы данных" в этом узле, после перехожу в (Группы элементов данных) GracePeriod, отмечаю галочкой элемент Template_Grace: Grace и нажимаю сперва "Очистить историю", а после "Выполнить сейчас"

В первый раз инициирую получение значения GracePeriod для хоста srv-ts00-abc

Получаю «Запрос успешно отправлен»

Шаг №9: Проверяю, что все успешно отработало и я получил данные:

http://IP&DNS/zabbix - user&pass - Мониторинг - Последние данные

  • Группа элементов данных: выбираю "GracePeriod"
  • Узлы сети: srv-ts00-abc

и нажимаю "Применить", по итогу получаем:

Результат получения значения в днях относительно сколько дней полнофункционального использования терминальным сервером осталось.

Что мне и хотелось.

Шаг №10: Задача: Как вынести результат элемента данных graceperiod на Карту Zabbix:

  • Тип: Узел сети
  • Подпись: Grace:{{HOSTNAME}:graceperiod.last()}
  • Расположение подписи: По умолчанию
  • Узел сети: srv-ts00-abc
  • Группа элементов данных: GracePeriod
  • Иконки по умолчанию: Server_96

Настройка что нужно указать дабы вынести получения результата на карту.

и нажимаю "Применить"

Шаг №11: После того как получили значение оставшихся дней нужно в шаблоне Template_Grace настроить триггер, что когда дней остается 7 или меньше, то срабатывает триггер:

http://srv-zabbix/zabbix - user&pass - Настройка - Шаблоны — переходим в шаблон "Template_Grace" - Триггеры - Создать триггер

  • Имя: GracePeriod 7
  • Важность: Высокая
  • Выражение: {Template_Grace:graceperiod.last()}<=7
  • Генерация ОК событий: Выражение
  • Режим генерации событий ПРОБЛЕМА: Одиночная
  • ОК событие закрывает: Все проблемы
  • Разрешить закрывать вручную: Отмечаю галочкой
  • Описание: GracePeriod меньше или равно 7 дней, удаляем ключ в реестре и перезагружаем систему и опять 120 дней
  • Активировано: Отмечаем галочкой

Создаем триггер на элемент данных Grace

и нажимаем "Добавить"

Отлично.

Итого я столько полезного для себя узнал и сделал, что на основе этого смогу еще что-нибудь разобрать в последствии.

На этом пока все, с уважением автор блога Олло Александр aka ekzorchik.