Заметки · 01.03.2024

Guacamole в консольных тонах

А на манеже всё те же: шлюз 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 и даже получили о них данные из домена.