А на манеже всё те же: шлюз Apache Guacamole и бесконечные развлечения в среде PowerShell. На этот раз посмотрим в сторону API, который предоставляет шлюз удалённых рабочих столов и попробуем поработать с ним из PowerShell ISE. При написании данного поста использовался замечательный модуль PSGuacamole.
Периодически возникает острая потребность провести подсчёт пользователей в Apache Guacamole и проверить актуальность учётных записей с точки зрения домена. Подчеркну, что я не использую ldap-расширение шлюза и добавление пользователей происходит в ручном режиме.
К сожалению, сбор количества пользователей проводить из веб-приложения нельзя, а считать строки вручную — такое себе занятие. В качестве альтернативного метода — можно посчитать пользователей в таблице guacamole_user в базе данных приложения guacamole_db, но быстро сравнить данные с Active Directory таким методом не получится.
Где-то здесь был пост, в котором я уже упоминал базу данных Apache Guacamole.
Не так давно я обнаружил модуль PSGuacamole, который позволяет работать с API шлюза прямо из консоли PowerShell. Модуль основан на Invoke-RestMethod и очень хорошо документирован. С помощью командлетов модуля можно полноценно обслуживать шлюз практически не обращаясь к странице веб-приложения. Звучит, конечно, всё это очень красиво, но… Вся волшба рассыпается в пыль как только в дело идёт кириллица. Победить проблему с транспортировкой кириллических символов через API я так и не смог: подбор нужной кодировки успехом не увенчался. Возможно, как только появится время — попробую решить эту проблему, а пока что…
Процедура установки модуля PSGuacamole вполне стандартна и останавливаться на ней отдельно — не вижу смысла. Сразу после установки можно запускать PowerShell ISE и получать токен API (New-GuacToken).
С помощью вот такой конструкции можно подключиться к серверу:
# Импортируем модуль в сессию # Import-Module -Name PSGuacamole # Переменная с адресом сервера # $server = "http://192.168.1.1:8080/guacamole" # Переменная с логином администратора # $login = "guacadmin" # Переменная с паролем администратора # $password = "veryverystrongpass" # Получение токена API для пользователя без вывода ответа в консоль # New-GuacToken -Username $login -Password $password -Server $server | Out-Null
Вывод ответа от New-GuacToken я скрыл, но если потребуется можете удалить Out-Null.
Добавим к конструкции командлет Get-GuacUsers, который позволяет получить список пользователей и настроим параметр DataSource. Так как у нас всё хранится именно в базе данных — DataSource должен обратиться к mysql:
Get-GuacUsers -DataSource mysql
Консоль поприветствует нас табличкой из двух столбцов: username и attributes. Колонка attributes нам не нужна, а вот логины пользователей в дальнейшем пригодятся. Докинем в кортеж командлет Select с отбором по username и отсортируем вывод:
Get-GuacUsers -DataSource mysql | Select -ExpandProperty username | Sort-Object
Получим перечень логинов пользователей шлюза c сортировкой по алфавиту. И вот теперь посчитаем количество пользователей по головам логинам.
В столбце username — в моём случае — есть пара пользователей, которые в выборке не нужны: пользователь-шаблон и, соответственно, администратор шлюза. От этих ребят избавимся командлетом Select-String и параметром Pattern. Далее обернём весь кортеж в скобки и добавим Count для подсчёта:
(Get-GuacUsers -DataSource mysql | Select -ExpandProperty username | Select-String -Pattern admin, temp -NotMatch).Count
Вся эта конструкция должна вернуть количество пользователей. Если увидели заветное число — значит с первой задачей справились успешно. Приступаем к сопоставлению пользователей шлюза с пользователями домена.
Вытаскиваем заветный кортеж из скобок и присваиваем его в качестве значения к переменной:
$users = Get-GuacUsers -DataSource mysql | Select -ExpandProperty username | Select-String -Pattern admin, temp -NotMatch
Добавляем цикл foreach для каждого отдельного объекта в переменной $users:
foreach($user in $users)
{
($user).ToString() | Get-ADUser | Select Name, SamAccountName, Enabled | Sort-Object -Property Name
}
Обращаю внимание, что переменную $user я конвертировал в строку, чтобы избежать ошибок несовместимости типов данных, а её значение передал в кортеж командлета Get-ADUser, выбрав нужные поля и проведя сортировку по отображаемому имени пользователя. Как только цикл отработает — консоль нарисует таблицу с заполненными столбцами: name, samaccountname и enabled.
Чтобы вывести список только тех пользователей, которые в настоящее время отключены в домене можно добавить в кортеж фильтрацию Where с оператором сравнения like по шаблону False:
foreach($user in $users)
{
($user).ToString() | Get-ADUser | Where {$_.Enabled -like "False"} | Select Name, SamAccountName, Enabled | Sort-Object -Property Name
}
Итого на сегодня: посчитали пользователей из шлюза удалённых рабочих столов Apache Guacamole и даже получили о них данные из домена.