Интеграция 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», создателем который является известный программист и писатель Марк Русси́нович. Данная программа позволит вам просмотреть дерево объектов выбранного вами домена, а если в начале запуска программы, сразу нажать кнопку «ОК», то домена по умолчанию, для текущего компьютера.

Далее приведен код процедуры, с помощью которого можно получить список групп домена, в определенном организационном блоке (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 в скриптах