Перейти к содержимому

Интеграция 1С и Active Directory

Интеграция 1С и Active Directory

Изредка, в работе программистов и системных администраторов, возникают ситуации и задачи, когда необходимо произвести интеграцию 1С и Active Directory. В данном примере будет показано как с помощью технологии LDAP (англ. Lightweight Directory Access Protocol — «облегчённый протокол доступа к каталогам») и средств интеграции 1С, получить данные из Active Directory. Интеграция 1С и Active Directory может использоваться не только для получения данных, но и для создания объектов в структуре соответствующего домена.
В процессе создания алгоритма интеграции 1С и Active Directory, будет весьма полезна программа «Active Directory Explorer», создателем который является известный программист и писатель Марк Русси́нович. Данная программа позволит вам просмотреть дерево объектов выбранного вами домена, а если в начале запуска программы, сразу нажать кнопку «ОК», то домена по умолчанию, для текущего компьютера.

Active Directory Explorer Интеграция 1С и Active Directory
Интеграция 1С и Active Directory

Далее приведен код процедуры, с помощью которого можно получить список групп домена, в определенном организационном блоке (OU):

&НаКлиенте
Процедура ПолучитьГруппыДомена()
	
	КомандаАДО    = Новый COMОбъект("ADODB.Command");
	СоединениеАДО = Новый COMОбъект("ADODB.Connection");
	
	СоединениеАДО.Provider = "ADSDSOObject";
	Попытка
		СоединениеАДО.Open("Active Directory Provider");	
	Исключение
		Сообщить("Ошибка при открытии Active Directory Provider: " + ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	КомандаАДО.ActiveConnection = СоединениеАДО;
	
	//Получаем имя домена к которому принадлежит данный компьютер 
	Попытка
		RootDSE = ПолучитьCOMОбъект("LDAP://RootDSE");
	Исключение
		Сообщить("Ошибка ПолучитьCOMОбъект(LDAP://RootDSE): " + ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	ТекущийДомен = RootDSE.Get("defaultNamingContext");
	Сообщить("ТекущийДомен: " + ТекущийДомен);
	
	//Подключаемся к текущему домену
	Попытка
		ОбъектТекущегоДомена = ПолучитьCOMОбъект("LDAP://" + ТекущийДомен);	
	Исключение
		Сообщить("Ошибка ПолучитьCOMОбъект "+"LDAP://" + ТекущийДомен+": " + ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	ИмяДомена = ОбъектТекущегоДомена.dc;
	Сообщить("ИмяДомена: " + ИмяДомена);
	
	//Формируем команду получения групп из блока Groups
	КомандаАДО.CommandText = "<LDAP://OU=Groups," + ТекущийДомен + ">" + ";(&(objectClass=top)(objectClass=organizationalUnit));name;onelevel";
	КомандаАДО.Properties("Page Size").Value     = 100;
	КомандаАДО.Properties("Timeout").Value       = 30;
	КомандаАДО.Properties("Cache Results").Value = Ложь;
	
	Попытка
		ВыборкаАДО = КомандаАДО.Execute();	
	Исключение
		Сообщить("Ошибка Execute(): " + ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	//Выводим список групп
	Пока НЕ ВыборкаАДО.EOF Цикл
		
		Сообщить("Группа домена: " + ВыборкаАДО.Fields("name").Value);
		
		ВыборкаАДО.MoveNext();
		
	КонецЦикла;
	
	//Обязательно закрываем соединения и объекты
	ВыборкаАДО.Close();
	СоединениеАДО.Close();
	
КонецПроцедуры

Теперь получаем данные пользователей, которые включены в выбранную группу домена:

&НаКлиенте
Процедура ПолучитьПользователейГруппы()
	
	КомандаАДО    = Новый COMОбъект("ADODB.Command");
	СоединениеАДО = Новый COMОбъект("ADODB.Connection");
	
	СоединениеАДО.Provider = "ADSDSOObject";
	Попытка
		СоединениеАДО.Open("Active Directory Provider");	
	Исключение
		Сообщить("Ошибка при открытии Active Directory Provider: " + ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	КомандаАДО.ActiveConnection = СоединениеАДО;
	
	Попытка
		RootDSE = ПолучитьCOMОбъект("LDAP://RootDSE");
	Исключение
		Сообщить("Ошибка ПолучитьCOMОбъект(LDAP://RootDSE): " + ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	ТекущийДомен = RootDSE.Get("defaultNamingContext");
	Сообщить("ТекущийДомен: " + ТекущийДомен);
	
	Попытка
		ОбъектТекущегоДомена = ПолучитьCOMОбъект("LDAP://" + ТекущийДомен);	
	Исключение
		Сообщить("Ошибка ПолучитьCOMОбъект "+"LDAP://" + Объект.ТекущийДомен+": " + ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	ИмяДомена = ОбъектТекущегоДомена.dc;
	Сообщить("ИмяДомена: " + ИмяДомена);
	
	
	КомандаАДО.CommandText = "<LDAP://OU=" + ГруппыДомена + ",OU=Groups," + Объект.ТекущийДомен + ">" + ";(&(objectCategory=person)(objectClass=user));sAMAccountName,userAccountControl,displayName,department,mail,telephoneNumber;onelevel";
	КомандаАДО.Properties("Page Size").Value     = 100;
	КомандаАДО.Properties("Timeout").Value       = 30;
	КомандаАДО.Properties("Cache Results").Value = Ложь;
	
	Попытка
		ВыборкаАДО = КомандаАДО.Execute();	
	Исключение
		Сообщить("Ошибка Execute(): " + ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	Пока НЕ ВыборкаАДО.EOF Цикл
		
		ПользовательДомена = Новый Структура;
		
		Если ВыборкаАДО.Fields("userAccountControl").Value = 514 ИЛИ
			ВыборкаАДО.Fields("userAccountControl").Value = 546 ИЛИ
			ВыборкаАДО.Fields("userAccountControl").Value = 66050 Тогда
			 
			Сообщить("Заблокирован");
		Иначе
			Сообщить("НеЗаблокирован");
		КонецЕсли;
		
		Сообщить("ИмяПользователя " + СокрЛП(ВыборкаАДО.Fields("displayName").Value));
		Сообщить("ИмяАккаунта "     + СокрЛП(ВыборкаАДО.Fields("sAMAccountName").Value));
		Сообщить("Подразделение "   + СокрЛП(ВыборкаАДО.Fields("department").Value));
		Сообщить("Почта "           + СокрЛП(ВыборкаАДО.Fields("mail").Value));
		Сообщить("Телефон "         + СокрЛП(ВыборкаАДО.Fields("telephoneNumber").Value));
		
		ВыборкаАДО.MoveNext();
		
	КонецЦикла;
	
	ВыборкаАДО.Close();
	СоединениеАДО.Close();
	
КонецПроцедуры

По этому примеру можно создавать более сложные примеры интеграции 1С и Active Directory, более подробные сведения, вы можете получить по следующим адресам:
ADSI LDAP Provider
Использование протокола LDAP в скриптах

15 комментариев для “Интеграция 1С и Active Directory”

  1. Попытка
    ОбъектТекущегоДомена = ПолучитьCOMОбъект(«LDAP://» + ТекущийДомен);
    Исключение
    Сообщить(«Ошибка ПолучитьCOMОбъект «+»LDAP://» + Объект.ТекущийДомен+»: » + ОписаниеОшибки());
    Возврат;
    КонецПопытки;

    Откуда Объект.ТекущийДомен появился ???????????????????????

  2. Уведомление: UPD. Расширяем возможности БД 1С — БД Analysis Core (Access, Excel, 1С)

  3. КомандаАДО.CommandText = "<LDAP://OU=" + ГруппыДомена + ",OU=Groups," + Объект.ТекущийДомен + ">" + ";(&(objectCategory=person) objectClass=user));sAMAccountName,userAccountControl,displayName,department,mail,telephoneNumber;onelevel";

    Подскажите пожалуйста как должна выглядеть строка «ГруппыДомена». Мне нужно получить пользователей нескольких групп.

    1. Приветствую, Олег.
      Попробуйте сначала получить список групп, с помощью процедуры ПолучитьГруппыДомена(), далее скопируйте наименования любой группы, в переменную ГруппыДомена и получить пользователей группы.

  4. Приветствую, Константин!
    Спасибо, понял. Я думал в этой переменной указанно сразу несколько групп, что решило бы мою задачу.
    Сейчас эта задача решена, но не правильно. Выбираю всех пользователей с атрибутом «memberOf» в котором находится массив с группами, в которых состоит пользователь и циклом в цикле перебираю эти группы с поиском нужной мне.

    Пробовал в запросе в отборе указать группы «WHERE memberOf = Группа1 OR memberOf = Группа2» итд.

    Если указать в отборе примерно 40 групп(точное количество не помню), то все работает, а если свыше 40, то выдается ошибка.
    Видать есть ограничение на максимальное количество, которое можно указать в отборе). Поэтому ищу решение, как можно вытащить пользователей, которые состоят только в определенных группах)))

  5. Подскажите пожалуйста, а обмен между AD и 1с ЗУП можно осуществить, если АД будет принимать данные, а не выгружать?

    1. Получается, что на стороне 1С, необходим интерфейс по предоставлению данных, например, oData, Web-сервис, HTTP-сервис, COM или через файл, а что то (скрипт) на стороне Active Directory, периодически или по событию запрашивает необходимые данные. Интересная задача, рекомендую обратится к документации и возможностям Active Directory.

  6. Рамиль Ахметов

    Получается таким образом можно попытаться авторизовывать пользователей через AD, елси пользователь будет вносить Логин и пароль от AD, 1С передает даные в AD, если успех то пускает в 1С.

  7. Здравствуйте, при выполнении кода, приведенного в статье, возвращается только один пользователь, если смотрим пользователей в группе и только одна группа в случае если смотрим группы. В чем может быть проблема? Запрашиваемые группы содержат подчиненные элементы (пользователей и/или подчиненные группы), если смотреть с пошью AD explorer

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *