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

17.02.25

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Управление учетными записями Active Directory из 1С:
.epf 11,77Kb
1
1 Скачать (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();

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    175786    976    403    

936

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

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

8400 руб.

20.08.2024    17389    120    59    

123

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

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

22200 руб.

06.10.2023    18315    49    19    

82

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

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

9360 руб.

17.05.2024    28469    98    48    

143

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

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

15000 руб.

10.11.2023    12522    49    33    

70

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 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

18000 руб.

06.12.2023    11410    48    8    

78

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

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

14400 руб.

29.04.2020    34343    109    152    

75
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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
Оставьте свое сообщение