Появился интерес мониторить с помощью Zabbix сессии пользователей подключающихся к Windows серверу по RDP. Использовать данную возможность можно как для целей мониторинга производительности сервера, так и для целей безопасности. С точки зрения безопасности можно записывать и уведомлять о том какие именно пользователи подключены к серверу. Это полезно для мониторинга подключения к серверам не являющихся терминальными для отслеживания административных подключений. Как установить и минимально настроить Zabbix хорошо показано здесь.
Как узнать кто подключен к серверу по RDP в консоли
За основу решения взял консольную команду qwinsta, которая отображает все активные подключения к серверу по RDP и на консоль. Запущенная без параметров она просто выведет список всех подключений в виде таблицы:
C:\Users\Dyachenko>qwinsta
СЕАНС ПОЛЬЗОВАТЕЛЬ ID СТАТУС ТИП УСТР-ВО
services 0 Диск
>console Dyachenko 1 Активно
31c5ce94259d4... 65536 Прием
rdp-tcp 65537 Прием Чтобы посчитать количество пользователей можно перенаправить вывод этой команды в команду find и отфильтровать только rdp подключения, а с ключом /c посчитать количество строк — это и будет число подключенных пользователей по RDP.
qwinsta | find /i "rdp-tcp#" /c Эту команду ровно в таком виде можно использовать в сенсоре Zabbix для подсчета количества подключенных пользователей, рисовать на ее основе график и слать алерты. Но мне захотелось так же отображать в дашборде и алертах список логинов пользователей.
Этот способ покажет конкретно подключенных по RDP пользователей сервера. Это наиболее точный вариант, который я нашёл для подсчета именно RDP сессий на сервере.
Как узнать количество пользователей на сервере
Но есть и менее точные методы узнать количество пользователей на сервере. Первый вариант использовать счетчик: system.users.num

Минус этого счетчика, что он считает всех пользователей, включая тех от имени которых запускаются службы или задания в планировщике.
Второй вариант позволяет подсчитывать количество пользователей по количеству уникальных связанных с пользователем процессов. Например процессов запуска explorer.exe. proc.num[explorer.exe]
![zabbix proc.num[explorer.exe]](https://www.k7d.ru/wp-content/uploads/2021/12/zabbix-proc.number-825x613.webp)
Минус в том, что в сессии пользователя может запустится больше одного процесса с указанным именем, а так же этот способ не позволяет считать только RDP сессии — интерактивная сессия консоли так же будет посчитана.
Плюсы этих способов в том, что вы можете включить их на любом установленном агенте прямо из консоли Zabbix без необходимости распространения на сервер скриптов или модификации конфигурационных файлов.
Список пользователей из qwinsta в Powershell
Для этих целей я нагуглил готовое решение и буквально двумя последними строчками доработал его под свои нужды. Я пытался сначала реализовать подобное с помощью bat-скрипта, но в итоге оказалось быстрее и проще на powershell. Вот сам скрипт:
function Get-TSSessions {
param(
$ComputerName = "localhost"
)
qwinsta /server:$ComputerName |
#Parse output
ForEach-Object {
$_.Trim() -replace "\s+",","
} |
#Convert to objects
ConvertFrom-Csv
}
#Get-TSSessions -ComputerName "localhost"
Get-TSSessions -ComputerName "localhost" | where -Property СЕАНС -Like "rdp-tcp#*" | select ПОЛЬЗОВАТЕЛЬ -ExpandProperty ПОЛЬЗОВАТЕЛЬ
Get-TSSessions -ComputerName "localhost" | where -Property SESSIONNAME -Like "rdp-tcp#*" | select USERNAME -ExpandProperty USERNAME Что он делает:
Функция получает список подключений с помощью qwinsta, после чего все пробелы в выводе меняются на запятые и полученный csv конвертируется в объект powershell, с которым потом очень удобно работать.
Последние две строки собственно получают объекты и выводят столбиком список пользователей без заголовка. Кусок кода с условием where отвечает за то, чтобы вывести только пользователей подключенных по RDP. Если вам нужно так же мониторить тех кто подключен к консоли сервера то необходимо будет эту часть отредактировать.
Два варианта вызова с русским и английским написанием параметров объекта нужны чтобы одинаково работать как на Windows Server с русской локализацией так и с английской. Если будете использовать на сервере с альтернативной локализацией, то раскоментируйте строчку #Get-TSSessions -ComputerName «localhost» и посмотрите вывод объекта, там будут все поля которые нужно прописать по аналогии с русским и английским вариантом.
Настройка на стороне сервера в Zabbix Agent
Все протестировано на серверах под управлением Windows Server 2012, 2016, 2019. В качестве Zabbix Agent использовалась версия Zabbix Agent 2 v 5.4.8. Агент установлен в папку c:\zabbix в которой используется следующая структура:
- c:\zabbix\conf.d — папка с подключаемыми конфигами;
- c:\zabbix\scripts — папка со скриптами для сбора различных параметров для сенсоров Zabbix.
Если у вас другая структура каталогов и размещение агента то внесите соответствующие коррективы. Конфиг для мониторинга подключений по RDP следующего содержания:
UserParameter=rdps[*],qwinsta.exe | find /i "rdp-tcp#" /c
UserParameter=rdp_users[*],powershell.exe -NoProfile -ExecutionPolicy bypass -File "C:\zabbix\scripts\ts_users.ps1" Необходимо положить в папку conf.d, а представленный выше скрипт в папку scripts.
Шаблон мониторинга RDP подключений для Zabbix 5.4 и выше
Данный шаблон добавляет 2 сенсора собирающие данные по количеству подключенных пользователей и их логины, 2 тригера с уровнем «Информация» для отображения на дашборде, а так же график для отрисовки количества подключений. График можно использовать для сравнительного анализа загрузки сервера с количеством подключенных пользователей и таким образом иметь дополнительный индикатор необходимости увеличения ресурсов.
zabbix_export:
version: '5.4'
date: '2021-12-21T09:38:18Z'
groups:
-
uuid: 7df96b18c230490a9a0a9e2307226338
name: Templates
templates:
-
uuid: d6d88a7e91e649a59825a04299287151
template: 'Template RDP User sessions'
name: 'Template RDP User sessions'
groups:
-
name: Templates
items:
-
uuid: 5f7ee37d4ab541138238b3166d906787
name: 'RDP Open Sessions'
key: rdps
tags:
-
tag: Application
value: Security
triggers:
-
uuid: 0598b2cf3f4a44a894999de4eccbe115
expression: 'last(/Template RDP User sessions/rdps)>0'
name: 'Open Sessions on {HOST.NAME}'
opdata: 'Users: {ITEM.LASTVALUE1}'
priority: INFO
-
uuid: 7e507bc13ee54124ab7dd9497738ddfd
name: 'RDP User Sessions'
key: rdp_users
trends: '0'
value_type: TEXT
tags:
-
tag: Application
value: Security
triggers:
-
uuid: 5992e489b8b145b0a921b94ac67d003f
expression: 'last(/Template RDP User sessions/rdp_users,#1)<>""'
name: 'Users on {HOST.NAME}'
opdata: 'Users: {ITEM.LASTVALUE1}'
priority: INFO
graphs:
-
uuid: 9f890c1d1b094e20b2d7e4c152c95f5b
name: 'RDP Users'
show_triggers: 'NO'
graph_items:
-
sortorder: '1'
drawtype: GRADIENT_LINE
color: 199C0D
item:
host: 'Template RDP User sessions'
key: rdps
Вот как выглядит результат в веб-консоли Zabbix.


Скачать шаблон и скрипты с Github
Для удобства залил все наработки на github https://github.com/dkplayer/zabbix-windows-rdp-users
Вопросы, дополнения и здравая критика приветствуются в комментариях.







