Как в 1С программно получить данные о доменном пользователе?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки часто возникает задача идентифицировать пользователя не по его учетной записи в 1С, а по данным его учетной записи в домене (Active Directory). Это особенно актуально, когда в информационной базе не заведены все сотрудники как пользователи, либо используется сквозная аутентификация. Рассмотрим подробно, как решить эту задачу в различных условиях: от толстого клиента до работы в современном веб-браузере.

Метод 1: Использование штатных свойств платформы

Если в информационной базе настроена связь между пользователем 1С и пользователем операционной системы, самым простым способом будет обращение к объекту ПользователиИнформационнойБазы. Разберем ситуацию, когда нам нужно получить строку, идентифицирующую пользователя в ОС. Проанализируем следующий подход:


ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ДоменныйЛогин = ТекущийПользовательИБ.ПользовательОС;
Сообщить(ДоменныйЛогин);

Важный нюанс: Этот метод работает корректно только в том случае, если в карточке пользователя 1С заполнено поле "Аутентификация операционной системы". Если же в базе используется общая учетная запись для всех или аутентификация 1С отключена вовсе, этот метод вернет пустую строку или не те данные, которые мы ожидаем. В таком случае нам придется использовать более глубокие инструменты интеграции.

Метод 2: Получение данных через COM-объекты (WinNT и LDAP)

Для Windows-клиентов (толстый или тонкий клиент) мы можем воспользоваться интерфейсами операционной системы. Посмотрим на пример кода, который позволяет получить полное имя пользователя и другие атрибуты из Active Directory, используя COM-соединение. Проанализируем ситуацию, когда у нас есть только имя пользователя ОС:


// Получаем объект пользователя через WinNT
ПользовательОС = "Domain\UserName"; // Можно получить через ИмяПользователя() или переменные окружения
ПользовательОбъект = ПолучитьCOMОбъект("WinNT://" + СтрЗаменить(ПользовательОС, "\", "/") + ",user");

// Получаем полное имя (FullName)
ПолноеИмя = ПользовательОбъект.FullName;
Сообщить("Полное имя пользователя: " + ПолноеИмя);

// Если нужно достучаться до расширенных свойств через LDAP
// Предположим, мы знаем путь к контейнеру (Distinguished Name)
LDAPПуть = "LDAP://CN=" + ПолноеИмя + ",OU=Users,DC=mycompany,DC=local";
ПользовательAD = ПолучитьCOMОбъект(LDAPПуть);
Телефон = ПользовательAD.telephoneNumber;

Рассмотрим недостатки этого метода. Основная проблема заключается в том, что ПолучитьCOMОбъект и работа с ActiveX (WScript.Shell) заблокированы в современных браузерах (Chrome, Firefox, Safari) из соображений безопасности. Если ваш пользователь работает через веб-клиент, этот код вызовет ошибку. Также этот метод привязан к платформе Windows и не будет работать на Linux-серверах.

Метод 3: Современный способ — Объект СоединениеLDAP

Начиная с версии платформы 1С:Предприятие 8.3.15, разработчики добавили нативный объект СоединениеLDAP. Это революционное решение, так как оно работает на стороне сервера (в том числе под Linux) и не требует использования COM. Выясним, как настроить поиск данных о пользователе с его помощью. Разберем по шагам процесс подключения:

1. Инициализируем соединение с контроллером домена. Мы можем использовать техническую учетную запись для поиска данных о других пользователях.


Соединение = Новый СоединениеLDAP;
Соединение.Сервер = "dc01.mycompany.local";
Соединение.Порт = 389;
Соединение.УчетнаяЗапись = "service_user@mycompany.local";
Соединение.Пароль = "SecretPassword123";

Попытка
    Соединение.УстановитьСоединение();
Исключение
    Сообщить("Ошибка подключения к AD: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

2. Выполним поиск пользователя по его логину (атрибут sAMAccountName), чтобы вычитать его электронную почту или отдел.


Фильтр = "(&(objectClass=user)(sAMAccountName=ivanov_ii))";
БазаПоиска = "DC=mycompany,DC=local";
Результат = Соединение.Поиск(БазаПоиска, Фильтр, "Subtree");

Для Каждого Запись Из Результат Цикл
    // Выводим атрибуты, например, почту и департамент
    Почта = Запись.Атрибуты.Получить("mail").Значения[0].Значение;
    Отдел = Запись.Атрибуты.Получить("department").Значения[0].Значение;
    Сообщить("Сотрудник: " + иванов_ii + ", Почта: " + Почта + ", Отдел: " + Отдел);
КонецЦикла;

Этот подход является наиболее надежным и кроссплатформенным. Он позволяет получать любую информацию из домена, не заставляя пользователя совершать лишних действий.

Метод 4: Работа в Веб-клиенте через настройки веб-сервера

Проанализируем ситуацию, когда пользователь заходит через браузер. Как мы выяснили, браузер не даст нам напрямую прочитать данные из ОС. Однако, если 1С опубликована на веб-сервере IIS (Internet Information Services), мы можем настроить "Windows Authentication" (сквозную аутентификацию).

В этом случае веб-сервер сам договаривается с браузером через протоколы Kerberos или NTLM. Когда запрос доходит до сервера 1С, платформа уже "знает", какой доменный пользователь его отправил. Чтобы это заработало даже при "отключенной" аутентификации в самой 1С, можно использовать следующие механизмы:

  1. Внешние пользователи: В механизмах БСП (Библиотека стандартных подсистем) существует возможность работы с внешними пользователями. Это позволяет идентифицировать человека, не создавая ему полноценную учетную запись в списке ПользователиИнформационнойБазы.
  2. Переменные окружения: На стороне сервера можно попытаться считать заголовок HTTP-запроса REMOTE_USER, который пробрасывает IIS. Для этого иногда требуются расширения веб-сервера или специализированные HTTP-сервисы на стороне 1С.

Метод 5: Использование PowerShell на стороне сервера

Если нам нужно быстро получить данные, а настраивать СоединениеLDAP нет возможности (например, из-за сложных политик безопасности), мы можем выполнить скрипт PowerShell на сервере 1С под правами системной службы. Посмотрим на пример запуска команды:


ЛогинДляПоиска = "ivanov_ii";
Команда = "powershell -Command ""Get-ADUser -Identity " + ЛогинДляПоиска + " -Properties EmailAddress | Select-Object -ExpandProperty EmailAddress""";

// Используем ЗапуститьПриложение для выполнения команды и получения результата из файла
ИмяФайлаРезультата = ПолучитьИмяВременногоФайла("txt");
ЗапуститьПриложение(Команда + " > " + ИмяФайлаРезультата, , Истина);

ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаРезультата, КодировкаТекста.OEM);
РезультатПоиска = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();

Этот метод является "костыльным", но рабочим в тех случаях, когда нужно получить специфические данные, которые трудно достать через стандартный LDAP-запрос, например, информацию о членстве во вложенных группах безопасности.

Подведем итог: Для современных решений на платформе 8.3 лучшим выбором будет использование объекта СоединениеLDAP на стороне сервера. Если же стоит задача просто идентифицировать пользователя в веб-клиенте без создания учетных записей 1С, необходимо настраивать сквозную аутентификацию на стороне веб-сервера (IIS/Apache) и использовать возможности интеграции ОС, которые предоставляет платформа "из коробки" при правильно настроенной публикации.

← На главную