Имя: Пароль:
1C
1С v8
Подключение к LDAP на сервере и на клиенте
0 Halyavnik
 
02.12.13
17:48
1С 8.2.19.76 Управляемое приложение, клиент-сервер, MS SQL.
Попытка получить данные с LDAP сервера. Тестовый компьютер и сервер приложений 1С входят в один домен, права пользователя: Domain Admin.
Есть код, который работает на тонком клиенте, но не работает на сервере. Кто-нибудь с таким сталкивался? И, если сталкивался, то как боролся?
[code]    Попытка
        oConnect = ПолучитьCOMОбъект( "", "ADODB.Connection" );
        oConnect.Provider = "ADSDSOObject";
        oConnect.Properties( "User ID" ).Value = "DomainAdmin";
        oConnect.Properties( "Password" ).Value = "DomainAdminPassword";            
        oConnect.Properties( "Encrypt Password").Value = True;    
        oConnect.Open( "Active Directory Provider" );
    Исключение
        СообщитьПользователю("Err: ADODB.Connection"+Символы.ПС+ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Query1 = "SELECT * FROM 'LDAP://my.domain/OU=Users,DC=my,DC=domain' WHERE objectClass='user'";
    
    Попытка
        RecordSet1 = oConnect.Execute( Query1 );
        Пока Не RecordSet1.EOF Цикл
            obj = ПолучитьCOMОбъект( RecordSet1.Fields(0).Value );
            СообщитьПользователю("Data: cn="+obj["cn"]);
            RecordSet1.MoveNext();
        КонецЦикла;
    Исключение
        СообщитьПользователю("Err: obj.cn"+Символы.ПС+ОписаниеОшибки());
    КонецПопытки;
[/code]
Ошибка на сервере возникает в момент выполнения строки obj = ПолучитьCOMОбъект( RecordSet1.Fields(0).Value );
1 Halyavnik
 
03.12.13
11:51
Странно... Не поверю, что никто с этим не работал.
2 Mafoni
 
03.12.13
12:03
отладку на сервер включаешь и смотришь чего у тя вот тут RecordSet1.Fields(0).Value  - содержится !!
3 Mafoni
 
03.12.13
12:04
и заччем вот к этому RecordSet1.Fields(0).Value делать еще ПолучитьCOMОбъект ???
4 Mafoni
 
03.12.13
12:05
Вот так  RecordSet1.Fields(0).Value.cn обратится разве нельзя к полю cn ?
5 НеБорис Нуралиев
 
03.12.13
12:09
(0) Код на сервере запускается от имени usr1c82. Возможно у него нет прав на чтение данных домена.
6 Mafoni
 
03.12.13
12:24
(5) Вас не смущает что выборка данных из LDAP сработала ? ибо ошибки вот тут не выдало RecordSet1 = oConnect.Execute( Query1 ); ???
7 Halyavnik
 
03.12.13
12:27
(5) Да, пользователь USR1CV82 - локальный, со всеми вытекающими. Но подключение к LDAP серверу осуществляется с учтеной записью администратора домена. Может, я чего-то не знаю, но мне кажется, что рыть надо где-то в другом месте.
(4) Наверное, можно. Это - первая попытка работы с LDAP. Был нагуглен пример, всё взято оттуда и адаптировано к потребностям. Спасибо за информацию, попробую так.
(6) Есть предположение, что по каким-то причинам сервер приложений 1С не может создать нужный COM-объект (это явно видно из ошибки), но для понимания причины моих знаний не хватает.
8 Mafoni
 
03.12.13
12:30
попробуй вот так - RecordSet1.Fields(0).Value.cn и если не затруднит сообщи результат.
9 Halyavnik
 
03.12.13
12:34
(4) Попробовал обратиться RecordSet1.Fields(0).Value.cn. Результат: нулевой.
а). RecordSet1.Fields(0).Value - строка.
"LDAP://my.domain/CN=ФИО,OU=ИмяОУ,OU=Пользователи,DC=my,DC=domain"
б). RecordSet1.Fields(0).Value.cn    {(1)}: Значение не является значением объектного типа (cn)    
Что, в принципе, предсказуемо после а).
10 Mafoni
 
03.12.13
12:42
попытка номер 2
поменяй сам запрос к LDAP на вот такой query = "SEL ECT ADsPath FR OM 'LDAP://DC ...... тут как у тя должно быть
11 Mafoni
 
03.12.13
12:43
12 Mafoni
 
03.12.13
12:44
и да как всегда - результат в студию :)
13 Halyavnik
 
03.12.13
12:55
(12) ИМХО, вряд ли поможет.
Заменена * на ADsPath
На клиенте - ОК.
На Сервере - ошибка.
14 Mafoni
 
03.12.13
13:01
(13) тут трудно не согласиться
15 Halyavnik
 
03.12.13
13:08
Единственное предположение (немного сумасшедшее, но...), что  (5) - всё-таки прав.
oConnect - создается подключение (да, здесь админ домена)
А вот это мы получаем уже под локальным USR1CV82, который не имеет прав.
obj = ПолучитьCOMОбъект( RecordSet1.Fields(0).Value );
В результате - ошибка.
Проверить смогу только вечером, ибо придется перезапускать сервер приложений от другого пользователя, в рабочее время - таким не балуемся.
Так что результат будет завтра. Спасибо за помощь.
16 Mafoni
 
03.12.13
13:19
Отпишись о результатах как попробуешь.
17 oleg_km
 
03.12.13
13:32
(15) не обязательно перезапускать сервер под другим пользователем, можно наоборот, дать пользователю 1С права с AD хотя бы на чтение
18 Halyavnik
 
03.12.13
13:38
(17) Эмммм... подскажете, как? Имеется в виду, подсказать, где в AD указываются права подключения к LDAP-серверу.
19 oleg_km
 
03.12.13
13:53
(19) Права устанавливаются не на подключение. Права устанавливаются на объекты, по аналогии с файловой системой. Консоль открой администрирование пользователей и компьютеров. Можно права на конкретного пользователя установить, можно на целое подразделение. Но лучше сначала книжку почитатай, а то легко все сковырнуть
20 Halyavnik
 
03.12.13
14:46
(19) Что-то не то. В консоли "Active Directory - пользователи и компьютеры" ни в свойствах ОУ, ни в свойствах конечных объектов НЕТ даже закладки "Безопасность".
Подобная закладка была обнаружена в консоли "Редактирование ADSI" - но там и не даст выбрать локального пользователя (тем более, другого компьютера).

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

Боюсь, подобные манипуляции можно совершать только с пользователями AD.
21 НеБорис Нуралиев
 
03.12.13
17:36
(20) Если есть домен, лучше юзера для 1С доменного делать.
Вы правы, локального юзера в доверенные домена не засунуть. По крайней мере я тоже не в курсе как это сделать.
22 oleg_km
 
03.12.13
17:47
Тогда придется перезапустить от доменного. С правами только нужно все проверить
23 Halyavnik
 
04.12.13
11:21
Итак, результат.
Был создан доменный юзер с именем (не особо мудрствуя) USR1CV82. Этому пользователю были даны права на папку сервера 1С аналогичные правам локального пользователя (ибо сервер не сможет писать логи и не запустится). Никаких других действий с точки зрения прав не выполнялось.
В свойствах службы (под чьим именем запускать) был указан свежесозданный пользователь.
Результат - всё заработало.

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

ВотЪ, как-то так.
24 НеБорис Нуралиев
 
04.12.13
11:37
(23) А где быстрее? На клиенте или сервере?
25 Halyavnik
 
04.12.13
13:39
(24) Простите, как-то упустил, что не указал. На сервере.