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