В процессе администрирования крупных инфраструктур 1С часто возникает задача мониторинга активных сеансов пользователей. Особенно актуальной она становится, когда контроль за использованием лицензий необходимо передать сотруднику, не обладающему правами системного администратора (например, главному бухгалтеру). Предоставлять такому пользователю полный доступ к консоли администрирования кластера серверов 1С небезопасно, так как это дает возможность случайно удалить базы или принудительно завершить критически важные сеансы.
В этой статье мы подробно разберем, как решить задачу предоставления прав "только для просмотра" списка сеансов по всем базам сервера. Мы проанализируем классический программный метод с использованием COM-соединения, разберем его ограничения и уязвимости, а также рассмотрим более современные и безопасные альтернативные архитектурные решения.
Самым быстрым и популярным способом программного получения списка сеансов в операционной системе Windows является использование технологии COM. Платформа 1С:Предприятие предоставляет специальный объект COMConnector, который позволяет подключиться к агенту сервера и получить детальную информацию о состоянии кластера.
Разберем по шагам готовый код внешней обработки, который собирает информацию обо всех активных сеансах со всех информационных баз текущего сервера:
СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "SRVR=");
Если ПозицияПоиска = 0 Тогда
Предупреждение("База должна быть серверной!");
Возврат;
КонецЕсли;
ПозицияОкончания = СтрНайти(СтрокаСоединенияСБД,""";Ref=""");
ИмяСервера = Сред(СтрокаСоединенияСБД, 7, ПозицияОкончания - 7);
Коннектор = Новый COMОбъект("V83.COMConnector");
СоединениеСАгентом = Коннектор.ConnectAgent(ИмяСервера);
// Получаем доступный кластер
мКластер = Неопределено;
Кластеры = СоединениеСАгентом.GetClusters();
Для Каждого Кластер Из Кластеры Цикл
мКластер = Кластер;
КонецЦикла;
Если мКластер = Неопределено Тогда
Предупреждение("Не найдено ни одного кластера!");
Возврат;
КонецЕсли;
// Проходим аутентификацию на кластере
СоединениеСАгентом.Authenticate(мКластер, , );
// Получаем список всех активных сеансов
мСеансы = СоединениеСАгентом.GetSessions(мКластер);
// Очищаем таблицы на форме перед заполнением
Сеансы.Очистить();
Для каждого Сеанс из мСеансы Цикл
// Добавляем строку в таблицу на форме
НовыйСеанс = Сеансы.Добавить();
// Заполняем реквизиты сеанса
НовыйСеанс.Компьютер = Сеанс.Host;
НовыйСеанс.База = Сеанс.infoBase.Name;
НовыйСеанс.Пользователь = Сеанс.userName;
НовыйСеанс.ДатаПодключения = Сеанс.StartedAt;
НовыйСеанс.ДатаПоследнейАктивности = Сеанс.LastActiveAt;
// Получаем серию используемой лицензии (если доступно)
Попытка
НовыйСеанс.Лицензия = Сеанс.License.Series;
Исключение
НовыйСеанс.Лицензия = "Не определена";
КонецПопытки;
КонецЦикла;
Проанализируем этот алгоритм. Сначала программа считывает строку подключения к текущей информационной базе и извлекает из нее имя сервера приложений 1С с помощью функции СтрокаСоединенияИнформационнойБазы(). Затем создается COM-объект V83.COMConnector, который выполняет подключение к серверу через метод ConnectAgent(). Программа перебирает доступные кластеры, авторизуется в них и с помощью метода GetSessions() собирает информацию обо всех активных сеансах во всех базах данного кластера. Полученные данные выгружаются в таблицу на форме для просмотра пользователем.
Несмотря на свою простоту и работоспособность, представленный выше метод имеет ряд существенных недостатков, которые могут стать критическими при промышленной эксплуатации системы:
comcntr.dll. Настройка корректной работы DCOM-компонентов требует ручного вмешательства в реестр Windows.Authenticate вызывается с пустыми параметрами администратора. Если на вашем рабочем кластере включена безопасность и задан пароль администратора кластера, этот код выдаст ошибку доступа. Прописывать же логин и пароль администратора кластера явным текстом в коде внешней обработки категорически запрещено по соображениям безопасности.Для обхода ограничений COM-технологий фирма "1С" разработала специальный программный интерфейс администрирования. Он состоит из двух частей: службы RAS (Remote Administration Server) и консольной утилиты RAC (Remote Administration Client).
Служба ras.exe запускается непосредственно на сервере 1С и транслирует запросы к кластеру по стандартному сетевому протоколу TCP (по умолчанию используется порт 1545). Утилита rac.exe представляет собой консольный клиент, который может отправлять команды серверу администрирования с любого компьютера сети, независимо от установленной операционной системы (Windows или Linux).
Мы можем реализовать код в 1С, который будет вызывать утилиту rac.exe в фоновом режиме, передавать ей параметры подключения и считывать результат работы из текстового файла. Рассмотрим пример такой реализации:
ПутьККонсолиRAC = "C:\Program Files\1cv8\8.3.10.2168\bin\rac.exe";
ПараметрыЗапуска = "session list --cluster=ID_ВАШЕГО_КЛАСТЕРА localhost:1545";
// Запускаем приложение во временный файл
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
СтрокаЗапуска = """" + ПутьККонсолиRAC + """ " + ПараметрыЗапуска + " > """ + ИмяВременногоФайла + """";
ЗапуститьПриложение(СтрокаЗапуска, , Истина);
// Читаем и анализируем полученный файл сеансов
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяВременногоФайла, КодировкаТекста.UTF8);
// Далее пишем парсер строк текстового файла для вывода в таблицу
Этот способ полностью решает проблему кроссплатформенности и не требует регистрации DLL-библиотек в операционной системе. Для безопасности можно настроить службу RAS таким образом, чтобы она принимала запросы только с локального хоста или определенных доверенных IP-адресов.
Если главная цель вашего бухгалтера — контроль используемых клиентских лицензий 1С, необходимо учитывать важный технический нюанс: количество активных сеансов в кластере практически никогда не совпадает с количеством реально занятых лицензий. Это происходит по следующим причинам:
Для точного аудита именно занятых программных лицензий рекомендуется использовать специализированный инструмент автоматизации — утилиту 1С:Enterprise Ring (модуль license), которая позволяет получить точные сведения о количестве и типах активированных лицензий на сервере.
Для обеспечения максимальной безопасности вашей корпоративной системы мы рекомендуем отказаться от предоставления прямого доступа к серверным механизмам пользователям. Вместо этого можно применить одну из следующих безопасных архитектурных схем:
ПолучитьСоединенияИнформационнойБазы(). Эта функция абсолютно безопасна, работает в контексте конкретной базы и не требует прав администратора кластера. Полученные данные о количестве активных пользователей базы записываются в общую папку или в единую "управляющую" базу. Главный бухгалтер открывает отчет в этой единой базе и видит актуальные цифры по всем базам сразу.