Имя: Пароль:
1C
1С v8
1C + LDAP = ?
,
0 Demetres
 
07.05.12
11:58
Добрый день, помогите решить проблему при работе с LDAP. Суть проблемы такова не получается выковырять значение атрибута Guid1C, он точно есть, через LDAPAdmin я его вижу. Использую следующий код, но возвращает всегда неопределенно. Атрибуты cn, sn, name получаю, хотя значение fullname тоже показывает неопределенно, подскажите в чем может быть проблема?

   conn = Новый COMОбъект("ADODB.Connection");

   conn.Provider = "ADSDSOObject";
       
   conn.Properties("User ID").value = "cn=user2c,ou=users,ou=anyname,dc=bander";
   conn.Properties("Password").value = "hhgjgkgyt15875sdg";      
   conn.Open("ADs Provider");
       
   rs = conn.Execute("<LDAP://192.168.220.40/dc=bander/ou=Users/ou=GK>;(uid=soldat_nq);ADsPath,objectClass,cn;subtree");
   
   Пока Не rs.EOF Цикл
       СтрокаЦн = rs.Fields(0).value;
       ОбъектАД = ПолучитьCOMОбъект(СтрокаЦн);
       
       //Тут проблема не могу получить значение атрибута Guid1C, ОбъектАД.Guid1C возвращает неопределено.

       rs.MoveNext();
   КонецЦикла;

   conn.Close();
1 Demetres
 
07.05.12
12:01
Думал может проблема с авторизацией при получении данных в Execute, но не пойму как прописать данные учетной записи там, вот так вот не работает:
rs = conn.Execute("<LDAP://192.168.220.40/dc=bander/ou=Users/ou=GK>;(uid=soldat_nq);ADsPath,objectClass,cn;subtree","cn=user2c,ou=users,ou=anyname,dc=bander","hhgjgkgyt15875sdg",0);
2 Demetres
 
07.05.12
12:30
вот такая вещь работает, возвращает то что надо, т.е. если я ищу по атрибуту guid1C поиск проходит правильно, а если хочу получить возвращает неопределенно

rs = conn.Execute("<LDAP://192.168.220.40/dc=bander/ou=Users/ou=GK>;(guid1C=<0000000000000000000000000000000000>);ADsPath;subtree");
3 vmv
 
07.05.12
14:21
примеры для толстого клиента, иба для 8.2 уже не особо актуально

/
// ADODB_Connection.Properties:
//
// "Password"            ,
// "User ID"             ,
// "Encrypt Password"     ,
// "Integrated Security" ,
// "Data Source"         ,
// "Location"            ,
// "Extended Properties" ,
// "Connect Timeout"     ,
// "Prompt"    Строка       ,
// "Window Handle"       ,
// "Mode"                ,
// "Bind Flags"          ,    
// "ADSI Flag"           ,    
//
// Получить свойства ADODB_Connection.Properties можно так
//
// Для каждого item Из ADODB_Connection.Properties Цикл  
//   мItemNameProperties.Добавить(item.Name);  
// КонецЦикла;
//
// Замечание:
// На форме авторизации есть страница "СтраницаДоступ" где можно указать доменные логин/пароль по которым возможно соединение по LDAP к AD.
// Эта страница доступна только для пользователя с полными правами, при модификации логина/пароля этого пользователя - модифицированные данные
// запишутся в константы LDAP_Disable_Anonymous, SuperUser, SuperUserPWD.
//
Функция ПолучитьДанныеПользователя_AD_In_LDAP(LDAP_Disable_Anonymous, AD_Domain_DC, AD_Array_Name_Attributes, LDAP_StartingPoint, LDAP_Filter) Экспорт

   // Настройка соединения  <ADODB.Connection>
   ADODB_Connection = Новый COMОбъект("ADODB.Connection");
   ADODB_Connection.Provider = "ADsDSOObject";
   Если LDAP_Disable_Anonymous Тогда
       ADS_SECURE_AUTHENTICATION = 1;                                            // Позволяет читать данные, когда не разрешен анонимный доступ
       ADODB_Connection.Properties("User ID"  ).Value = AD_Domain_DC+"\"+Константы.SuperUser.Получить();
       ADODB_Connection.Properties("Password" ).Value = Константы.SuperUserPWD.Получить();
       ADODB_Connection.Properties("ADSI Flag").Value = ADS_SECURE_AUTHENTICATION;
   Иначе
       ; // Ничего не делаем, т.к. провайдер LDAP при анонимном доступе не требует логин/пароль по которым возможно соединение по LDAP
   КонецЕсли;
   ADODB_Connection.Open("Active Directory Provider");
   
   // Наcтройка свойств <ADODB.Command>
   // ADS_SCOPE_SUBTREE = 2
   ADODB_Command    = Новый COMОбъект("ADODB.Command");
   ADODB_Command.ActiveConnection =ADODB_Connection;
   ADODB_Command.Properties("Page Size").Value     = 1000;
   ADODB_Command.Properties("Timeout").Value       = 30;
   ADODB_Command.Properties("Cache Results").Value = Ложь;
   //ADODB_Command.Properties("Searchscope") = ADS_SCOPE_SUBTREE;
   
   // Инициализация строки атрибутов для передачи в запрос по AD
   Count_Attributes = AD_Array_Name_Attributes.Количество(); String_Attributes = "";
   Для Инд = 0 По AD_Array_Name_Attributes.ВГраница() Цикл
       String_Attributes = String_Attributes + AD_Array_Name_Attributes[Инд] + ?(Инд + 1 = Count_Attributes, "", ",");
   КонецЦикла;
   
   // Формирование текста запроса ADODB_Command
   CommandText = "<LDAP://" +LDAP_StartingPoint+ ">;" +LDAP_Filter+ ";" +String_Attributes+ ";subtree";    
   
   // Выполнение запроса ADODB_Command
   ADODB_Command.CommandText = CommandText;
   Попытка
       Selection_ADODB = ADODB_Command.Execute();
   Исключение
       Предупреждение(ОписаниеОшибки() + Символы.ПС + " Администратору приложения необходимо установить параметры доступа по LDAP", 120);
       Возврат Новый ТаблицаЗначений;
   КонецПопытки;
   
   // Создание колонок таблицы в которую будут помещены результаты запроса
   Тз = Новый ТаблицаЗначений;
   Для Каждого ЭлементМассива Из AD_Array_Name_Attributes Цикл
       Тз.Колонки.Добавить(ЭлементМассива);
   КонецЦикла;

   // Заполнение таблицы по результатам запроса
   Пока Не Selection_ADODB.EOF Цикл
       НоваяСтрока = Тз.Добавить();
       Для Каждого ЭлементМассива Из AD_Array_Name_Attributes Цикл
           НоваяСтрока[ЭлементМассива] = Selection_ADODB.Fields(ЭлементМассива).Value;
       КонецЦикла;
       Selection_ADODB.MoveNext();
   КонецЦикла;
   
   // Закрытие соединений
   Selection_ADODB.Close();
   ADODB_Connection.Close();
   
   Возврат Тз;
   
КонецФункции



//
// Комментарии в методе приведены для примера, когда у нас ADUnits.Количество()=2, где: ADUnits[0]="1C" и ADUnits[0]="NA",
// имя выбранного домена "consalt.ru" и имя(доменный логин) пользователя "Test1C" .
// Первый юнит  - это корень AD для приложений 1С соответствующего домена;
// Воторой юнит - это ветка в первом юните относительно приложения "NA" (Необоротные активы);
//
// Отметим, что пользователи могут зайти в приложение оносительно любого домена, но при выполнении следующих условий...
// 1. В выбранном домене пользователь существует и подтвердил свой пароль;
// 2. В выбранном домене есть юниты 1C>>NA>> и >> "Группы входимости"
// 3. Пользователь член хотя бы одной из этих групп;
// 4. Для хотя бы одной из найденных для пользователя групп AD в юнитах 1C>>NA>> сопоставлена Роль1С.
//
// Комментарии в теле метода даны оносительно данных представленого тут примера.
//
Функция ПолучитьДанныеПользователя_AD_In_LDAP(Логин)
   
   // Получим булево значение: сервер LDAP запрещает анонимный доступ
   LDAP_Disable_Anonymous = Константы.LDAP_Disable_Anonymous.Получить();
   
   // Получим имена выбранного пользователем домена и логина(в форме они могут быть набраны как \\CONSALT, CONSALT.RU, \\CONSALT\TEST1C).
   AD_Domain_DC                = AD_Параметры.Получить("AD_Domain_DC");                // "CONSALT"
   AD_Domain_distinguishedName = AD_Параметры.Получить("AD_Domain_distinguishedName"); // "DC=consalt,DC=ru"
   AD_User_sAMAccountName      = AD_Client.Получить_AD_User_sAMAccountName(Логин);     // "TEST1C"
   
   // Получим массив имен атрибутов доменного пользователя, значения которых необходимо получить.
   AD_Array_Name_Attributes = Новый Массив;                
   AD_Array_Name_Attributes.Добавить("distinguishedName");  // Отличительное (характерное) имя пользователя, например, "CN=Иван И. Иванов,OU=Служба АСУ,OU=УТСиАСУ,DC=consalt,DC=ru"
   AD_Array_Name_Attributes.Добавить("cn");                 // Наименование доменного пользователя, как он "видит" себя в ОС.
   
   // Получим LDAP_StartingPoint провайдера LDAP.
   LDAP_StartingPoint = AD_Domain_distinguishedName;
   
   // Получим фильтр для позиционирования на запись пользователя в AD по выбранному логину.
   LDAP_Filter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName="+AD_User_sAMAccountName+"))";  // objectCategory и objectClass ускорят чтение
   
   // Получим данные из AD
   ТзДанныеАД = AD_Client.ПолучитьДанныеПользователя_AD_In_LDAP(LDAP_Disable_Anonymous, AD_Domain_DC, AD_Array_Name_Attributes, LDAP_StartingPoint, LDAP_Filter);
   Если ТзДанныеАД.Количество() = 0 Тогда
       AD_Параметры.Вставить("УспешнаяАвторизация", Ложь);
       Возврат Ложь;
   КонецЕсли;
   
   // Вставим полученные данные в соответствие как строковые параметры, которое "видит" ЭтаФорма и методы глобальных модулей на "Клиенте/Сервере".  
   AD_User_distinguishedName = ТзДанныеАД[0].distinguishedName;
   AD_Параметры.Вставить("AD_User_distinguishedName", AD_User_distinguishedName);
   AD_Параметры.Вставить("AD_User_Сn"               , ТзДанныеАД[0].cn);  
   AD_Параметры.Вставить("ИмяПользователяИБ"        , AD_Domain_DC+"\"+AD_User_sAMAccountName);
   
   // Получим массив имен атрибутов групп, значения которых необходимо получить из прочитанных групп AD.
   AD_Array_Name_Attributes = Новый Массив;
   AD_Array_Name_Attributes.Добавить("cn");
   
   // Получим характерное имя сокращенной формы строки связывания провайдера LDAP для чтения групп входимости доменного пользователя.
   LDAP_StartingPoint = AD_Client.ПолучитьADUnits(Истина, Истина)+ "," + LDAP_StartingPoint;  // "OU=NA,OU=1C,DC=consalt,DC=ru"
   
   // Получим фильтр для позиционирования на группы пользователя в иерархии LDAP_StartingPoint  
   LDAP_Filter = "(&(objectCategory=group)(member="+AD_User_distinguishedName+"))";
   
   // Получим данные из AD
   ТзДанныеАД = AD_Client.ПолучитьДанныеПользователя_AD_In_LDAP(LDAP_Disable_Anonymous, AD_Domain_DC, AD_Array_Name_Attributes, LDAP_StartingPoint, LDAP_Filter);
   
   // Вставим полученные данные в соответствие как ТаблицуЗначений.
   // В дальнейшем эти параметры с клиента передаются на сервер для модификации прав/ролей ПользователяИБ. При передаче на сервер нужно удалять мутабельные параметры.
   // Таким образом, значение по ключу "AD_User_Groups" нужно выделять в отдельный массив примитивных типов и удалять как элемент соответствия из AD_Параметры.
   // Но тут(на клиенте) мы получаем его в таблицу значений, т.к. теоретически мы может читать из AD какие угодно атрибуты, добавив элементы в AD_Array_Name_Attributes.
   AD_Параметры.Вставить("AD_User_Groups", ТзДанныеАД);
   
   Возврат Истина;   // Возврат необходим для проверки SuperUser в случае запрета анонимного доступа.
   
КонецФункции
4 Jaap Vduul
 
07.05.12
14:33
Нужно указать в строке запроса атрибуты, которые хочешь получить.

<LDAP://server/adsidn>;ldapfilter;attributescsv;scope

Т.е. attributescsv
Сейчас у тебя только следующие: "...;ADsPath,objectClass,cn;..."
5 Demetres
 
07.05.12
15:05
(3) надо переварить, спасибо
(4) я пробовал перечислять, если пишешь "<LDAP://192.168.220.40/dc=bander/ou=Users/ou=GK>;(uid=soldat_nq);ADsPath,objectClass,cn,GUID1C;subtree" то выдает ошибку
6 Demetres
 
10.05.12
13:41
(3) у Вас не было проблемы с полчением некоторых атрибутов? У меня почему-то не все атрибуты доступны через запрос, в списке утилиты LDAPAdmin я их вижу а запросом получить не могу
7 Demetres
 
10.05.12
15:40
вверх
8 Demetres
 
10.05.12
15:41
Почему могут быть доступны не все атрибуты
9 vmv
 
10.05.12
15:44
(8) ограничены права на чтение уровне домена/АД и прочих прелестей к которым одиби и 1с не имеют отношения, хочешь получить список телефонов девочек шефа? а вот хрен)
10 Demetres
 
10.05.12
16:03
(9) учетная запись которую я использую для ADODB.Connection отлично работает в утилите LDAPAdmin в ней значения атрибутов видны и редактируются. Я подумал может проблема в самом ADODB.Connection
11 Demetres
 
10.05.12
16:06
Вот что пишет когда смотришь описание ошибок
conn.Errors(0).Description = "Поставщик не поддерживает это свойство."
только не понятно что за поставщик и как сделать что бы он всё поддержал???
12 Demetres
 
10.05.12
16:28
на верхушку
13 Demetres
 
10.05.12
16:57
Jgznm yf dth[
14 Demetres
 
10.05.12
17:13
???
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn