|
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
|
???
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |