Управление учетными записями Active Directory из 1С

13.03.25

База данных - Инструменты администратора БД

Краткое описание управлением пользователями Active directory через 1С. Появилась задача создания для принятых на работу сотрудников учётных записей в Active directory. Статей нашёл немало, только код увидеть можно, скачав обработку или читая комментарии. Там часто слишком много букв, полезные комментарии находятся в разных темах, etc, etc, etc. Полученные знания аккумулировал, получилась такая вот шпаргалка.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Управление учетными записями Active Directory из 1С:
.epf 11,77Kb
9
9 Скачать (1 SM) Купить за 1 850 руб.

1. Параметры подключения

В примерах будет  использоваться структура ПараметрыПодключения

    ПараметрыПодключения= Новый Структура;
    ПараметрыПодключения.Вставить("Домен", Домен);
    ПараметрыПодключения.Вставить("Логин", Логин);
    ПараметрыПодключения.Вставить("Пароль", Пароль);


2.  Создание соединения

Функция СоздатьСоединение(аПараметрыПодключения)
    Попытка
        СоединениеАДО = Новый COMОбъект("ADODB.Connection");
        СоединениеАДО.Provider = "ADsDSOObject"; 
        ADS_SECURE_AUTHENTICATION = 1;    
        СоединениеАДО.Properties("User ID"  ).Value = аПараметрыПодключения.Домен + "\" + аПараметрыПодключения.Логин;
        СоединениеАДО.Properties("Password" ).Value = аПараметрыПодключения.Пароль;
        СоединениеАДО.Properties("ADSI Flag").Value = ADS_SECURE_AUTHENTICATION;
        СоединениеАДО.Open("ADs Provider");
    Исключение
        СоединениеАДО = Неопределено;
        Сообщить("Ошибка: " + ОписаниеОшибки());
    КонецПопытки;
    Возврат СоединениеАДО
КонецФункции

3. Закрытие соединения

СоединениеАДО.Close();
СоединениеАДО = Неопределено;

4. Поиск элементов в домене 
Возможно осуществлять с помощью SQL запроса к LDAP. Для операций с объектами достаточно знать их AdsPath, поэтому в запросах других полей не указываю. Механизм поиска отличается только тексами запросов. Пояснения тут: Active Directory: Использование LDAP-фильтров (ru-RU)  

Сначала в строковой переменной нужно сформировать текст запроса:
a.    Подразделения (organization unit)

ТекстЗапроса = "SELECT AdsPath
               |FROM 'LDAP://" + ПараметрыПодключения.Домен + "'
               |WHERE objectCategory = 'organizationalunit' and name = 'Имя подразделения'
               |"

b.    Группы доступа

ТекстЗапроса = "SELECT AdsPath
               |FROM 'LDAP://" + ПараметрыПодключения.Домен + "'
               |WHERE objectCategory = ' group' and name = 'Имя группы доступа'
               |";

c.    Пользователя

ТекстЗапроса = "SELECT AdsPath
               |FROM 'LDAP://" + ПараметрыПодключения.Домен + "'
               |WHERE objectCategory = ' user' and objectClass = 'person' and SamAccountName = 'Логин пользователя'
               |"

Отбор в запросе желательно указать таким образом, чтобы было найдено не более одной записи.

Выборка = СоединениеАДО.Execute(ТекстЗапроса);
Если НЕ Выборка.EOF() Тогда
	ДанныеПоля = Выборка.Fields("AdsPath");
	ВозвращаемоеЗначение = ДанныеПоля.Value;
Иначе
	ВозвращаемоеЗначение = ""
КонецЕсли;

Функция поиска возвращает строку, которая затем будет являться входным параметрам дальнейших операций. 
5.    Создать пользователя. Доступ к реквизитам свежего пользователя через «=» невозможен, необходимо устанавливать с помощью метода «put». Сисадмины в тестовом домене создали дополнительное свойство у пользователя (guid1c), пример заполнения добавил, но закомментировал.

// аПодразделение – это результат поиска в домене функцией п4.
ПодразделениеПользователя = ПолучитьCOMОбъект(аПодразделение);
ПолноеИмя = СокрЛП(Фамилия) + " " + СокрЛП(Имя) + " " + СокрЛП(Отчество);
НовыйПользователь = ПодразделениеПользователя.Create("User" ,"CN="+ПолноеИмя);
НовыйПользователь.Put("sn",                 Фамилия);
НовыйПользователь.Put("givenName",         Имя);
НовыйПользователь.Put("SamAccountName",     ЛогинПользователя);
// ИДПользователя = XMLСтрока(ФизическоеЛицо.УникальныйИдентификатор());
// НовыйПользователь.Put("guid1c",             ИДПользователя);
НовыйПользователь.Put("userPrincipalName",     ЛогинПользователя);
НовыйПользователь.Put("displayName", ПолноеИмя);
НовыйПользователь.SetInfo();

6. Обновить пользователя.

Свойства уже можно изменять через операцию присваивания

СтарыйПользователь.Sn = ВРег(НовыйПользовательФамилия)

, но я всё равно использую «put». Установить пароль у нового пользователя у меня не получилось, я создаю, записываю пользователя, а потом обновляю его с изменением пароля.

// аПользователь – это результат поиска в домене функцией п4.
СтарыйПользователь = ПолучитьCOMОбъект(аПользователь);
//СтарыйПользователь.put("guid1c", НовыйГУИД); 
СтарыйПользователь.put("sn", ВРег(Фамилия)); 
// в таком формате свойство Put("Имя свойства", "Значение свойства")
СтарыйПользователь.SetPassword("" + НовыйПользовательПароль);
СтарыйПользователь.userAccountControl = 544;
СтарыйПользователь.SetInfo();

Дополнения к созданию/обновлению пользователя:

Значение поля «userAccountControl» определяется по флагам Значения флагов UserAccountControl

Для флагов доступно сложение. Например,

32 - PASSWD_NOTREQD (Пароль не требуется)
512 - NORMAL_ACCOUNT (Это тип учетной записи по умолчанию, который представляет обычного пользователя)
При установке значения 544 (512 + 32) получаем «Учетная запись по умолчанию, пароль не требуется»

В карточке пользователя есть дополнительные поля, которые можно заполнять (обновлять) при создании/обновлении учётной записи. Имя, по которому можно к ним обратиться можно найти на странице user class active directory

Например, при создании мне нужно добавлять номер домашнего телефона. Нахожу атрибут «Phone-Home-Primary», перехожу по ссылке, получаю Ldap-Display-Name «homePhone». Следовательно, чтобы внести номер домашнего телефона в карточку AD, нужно добавить строку:

НовыйПользователь.put("homePhone", НомерДомашнегоТелефона)

7. Проверить наличие пользователя в группе доступа. При добавлении или исключении пользователя из группы доступа необходимо проверить есть ли он там. Операции добавления уже добавленного и исключение отсутствующего пользователя вызывают ошибку-исключение.

// аГруппа – это результат поиска в домене функцией п4.
// аПользователь – это результат поиска в домене функцией п4.
Результат = Ложь;
ЭлементГруппы = ПолучитьCOMОбъект(аГруппа);
Для Каждого Юзверь из ЭлементГруппы.Members() Цикл
     Если Юзверь.AdsPath = аПользователь тогда
          Результат = Истина;
          Прервать;
     КонецЕсли;
КонецЦикла;

8.    Добавить пользователя в группу доступа.

// аГруппа – это результат поиска в домене функцией п4.
// аПользователь – это результат поиска в домене функцией п4.
ЭлементГруппы = ПолучитьCOMОбъект(аГруппа);
ЭлементГруппы.Add(аПользователь);  
ЭлементГруппы.SetInfo();

9. Исключить пользователя из группы доступа

// аГруппа – это результат поиска в домене функцией п4.
// аПользователь – это результат поиска в домене функцией п4.
ЭлементГруппы = ПолучитьCOMОбъект(аГруппа);
ЭлементГруппы.remove(аПользователь);  
ЭлементГруппы.SetInfo();

10.    Изменить подразделение (Organization unit) пользователя

// ДанныеНовогоПодразделения – это результат поиска в домене функцией п4 подразделения назначения (куда перемещаем)
// аПользователь – это результат поиска в домене функцией п4 пользователя (кого перемещаем).
ПолноеИмя = СокрЛП(Фамилия) + " " + СокрЛП(Имя) + " " + СокрЛП(Отчество);
НовоеПодразделение =ПолучитьCOMОбъект(ДанныеНовогоПодразделения);
НовоеПодразделение.MoveHere(ДанныеПользователя, "CN=" + ПолноеИмя);
НовоеПодразделение.SetInfo();

 

Общие замечания:

1. Строку для подключения лучше не формировать, а получать поиском поле "AdsPath".

2. Свойства полученного COM-объекта процедурой "ПолучитьCOMОбъект" в отладчике не видны, ключевые слова для поиска подобрать сложно.

В приложенной обработке эти пункты реализованы в виде функций.

Краткое описание формы:

Группа "Подключение к домену" - параметры подключения

Группа "Панель поиска" - для тестирования поиска в домене - нужно выбрать тип элемента (пользователь, группа или подразделение (OU)), указать свойство по которому ищем и значение что ищем. В поле Результаты поиска будет первый найденный элемент.

Группа "Панель создания пользователя."

Кнопка "Создать" - создает пользователя домена, Кнопка "Обновить" обновляет фамилию и пароль пользователя.

Кнопка "Переместить в подразделение" перемещает пользователя в другой organization unit, имя которого указано в поле "Подразделение".

Кнопки "Добавить в группу" и "Исключить из группы" добавляют (исключают) пользователя из группы, наименования которых перечислены в поле "Группы доступа" через запятую.

Все операции с группами и подразделениями проходят для пользователя логин которого указан в поле "Логин" на панели создания пользователя.

Проверено на следующих конфигурациях и релизах:

  • Зарплата и управление персоналом КОРП, редакция 3.1, релизы 3.1.31.67

Пользователи Active directory Домен Сотрудники Физические лица

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    183894    1024    403    

967

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    24149    159    84    

158

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

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

15000 руб.

10.11.2023    13634    57    33    

77

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

22200 руб.

06.10.2023    20252    51    19    

86

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

19200 руб.

06.12.2023    12616    56    8    

85

Инструментарий разработчика Программист Платформа 1С v8.3 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    30474    104    48    

147

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    35454    113    152    

78
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. D-masterrr 19.02.25 10:56 Сейчас в теме
по поводу нового пользователя все таки можно через равно свойства устанавливать. приведу пример кода, который еще года с 14 работает
ОрганизационнаяЕдиницаОбъект    = ПолучитьCOMОбъект("LDAP:// "+ОрганизационнаяЕдиница);
		ПользовательAD                  = ОрганизационнаяЕдиницаОбъект.Create("user", "CN=" + СокрЛП(ФИО));
		
		ПользовательAD.Department       = СокрЛП(сзРеквизитыСотрудника.МестоВСтруктуреКомпании); 
		


по поводу свойства userAccountControl = 544 - что за свойство?
у меня 512 - активен, 514 - неактивен.
3. dehro 12 24.02.25 09:58 Сейчас в теме
(1)
...можно через равно свойства устанавливать.

Не все. Зависимости пока не нашёл, но выяснил, что через put надёжнее (меньше шансов получить исключение).

... userAccountControl = 544...

Побитовая раскладка, числа степени двойки Расшифровка UserAccountControl:

2 - ACCOUNTDISABLE (Учетная запись пользователя отключена).
32 - PASSWD_NOTREQD (Пароль не требуется)
512 - NORMAL_ACCOUNT (Это тип учетной записи по умолчанию, который представляет обычного пользователя)/

Следовательно,
514 (512 + 2) - Учетная запись по умолчанию, отключена
544 (512 + 32) - Учетная запись, пароль не требуется.

Про пароль тоже согласен, статья создавалась как краткая шпаргалка: про бантики и галочки на усмотрение читающего.
2. D-masterrr 19.02.25 11:49 Сейчас в теме
также посоветовал бы в моменте с назначением пароля добавить код, чтобы пользователь принудительно установил свой пароль, а не стандартный был.
ПользовательAD.pwdLastSet        = 0; //менять пароль при входе. иначе -1
4. www_20981 03.04.25 14:30 Сейчас в теме
Роман, добрый день.
А чтобы отрабатывал код

ЭлементГруппы = ПолучитьCOMОбъект(аГруппа);
ЭлементГруппы.Add(аПользователь);
ЭлементГруппы.SetInfo();

нужно чтобы пользователь, по которым это выполняется, имел права на изменения данных в AD?

аГруппа и аПользователь - у меня уже есть готовые (получены ранее) строки.
При попытке выполнить код, возникает ошибка (remove или add)

Ошибка при вызове метода контекста (remove): Произошла исключительная ситуация (0x80070005)

Я так понимаю, что это из-за того, что у пользователя нет прав.
5. dehro 12 08.04.25 15:02 Сейчас в теме
(4) Да. если выполняете на клиенте, то под пользователем системы.
Если на сервере, то пользователь под которым запущена служба 1С
6. www_20981 08.04.25 20:35 Сейчас в теме
Оставьте свое сообщение