среда, 24 апреля 2019 г.

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

Изредка, в работе программистов и системных администраторов, возникают ситуации и задачи, когда необходимо произвести интеграцию 1С и Active Directory. В данном примере будет показано как с помощью технологии LDAP (англ. Lightweight Directory Access Protocol — «облегчённый протокол доступа к каталогам») и средств интеграции 1С, получить данные из Active Directory. Интеграция 1С и Active Directory может использоваться не только для получения данных, но и для создания объектов в структуре соответствующего домена.
В процессе создания алгоритма интеграции 1С и Active Directory, будет весьма полезна программа «Active Directory Explorer», создателем который является известный программист и писатель Марк Русси́нович. Данная программа позволит вам просмотреть дерево объектов выбранного вами домена, а если в начале запуска программы, сразу нажать кнопку «ОК», то домена по умолчанию, для текущего компьютера.
Далее приведен код процедуры, с помощью которого можно получить список групп домена, в определенном организационном блоке (OU):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
&НаКлиенте
Процедура ПолучитьГруппыДомена()
     
    КомандаАДО    = Новый 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();
     
КонецПроцедуры
Теперь получаем данные пользователей, которые включены в выбранную группу домена:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
&НаКлиенте
Процедура ПолучитьПользователейГруппы()
     
    КомандаАДО    = Новый 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 в скриптах
Источник: здесь

Комментариев нет:

Отправить комментарий