Имя: Пароль:
1C
1С v8
Не проходит синхронизация с ActiveDirectory
0 PVS_Mtl
 
08.06.15
09:33
Добрый день.
Из 1С 8.2 УПП (толстый клиент) провожу синхронизацию данных с ActiveDirectory по имени учетной записи, отделу, должности и т.п. и получаю ошибку на строке Пользователь.SetInfo(): Исключительная ситуация 0х8007001f Устройство не подключено к системе.
Причем эта ошибка появляется как при работе из моей учетной записи с моей машины (я локальный админ, и ошибка объяснима), так и при запуске толстого клиента из администраторской учетной записи, с машины расположения AD. Из админской учетной записи вручную, используя интерфейс AD, записи правятся без проблем. Чтение атрибутов из 1С также происходит нормально. Подскажите, как избежать появления ошибки:

функция ПолучитьМодифицироватьУчетнуюЗаписьAD(предИмяAD,текИмяAD,строка)
    
    //пробуем найти объект по пред имени и изменять его
    текст = "LDAP://CN="+предИмяAD+",CN=Users,DC=Metall1C,DC=local";
    попытка    
        Пользователь = ПолучитьCOMОбъект(текст) ;
    исключение
            текст = "LDAP://CN="+текИмяAD+",CN=Users,DC=Metall1C,DC=local";
        попытка    
            Пользователь = ПолучитьCOMОбъект(текст) ;
        исключение
            //создаем новый
            
            пользователь = создатьУчетнуюЗаписьAD(текИмяAD,строка.логин);
        конецПопытки;
    конецПопытки;
    сообщить(пользователь.name);
    Пользователь.Put("sAMAccountName", строка.имяAD);
    //СтрЗаменить(Имя," ","_");

    Пользователь.Put("displayName", строка.сотрудник.наименование);
    Пользователь.Put("name", строка.имяAD);
    массивФИО = общегоназначения.ПолучитьМассивФИО(строка.сотрудник.наименование);
    Пользователь.Put("sn", массивФИО[0]);
    Пользователь.Put("givenName", массивФИО[1]);
    Пользователь.Put("initials", массивФИО[2]);
    Пользователь.Put("title", строка.сотрудник.текущаяДолжностьОрганизации.наименование);
    Пользователь.Put("department", строка.сотрудник.текущееПодразделениеОрганизации.наименование);
    
    Пользователь.Put("mail", строка.адресЭлектроннойПочты);
    Пользователь.Put("userPrincipalName", строка.адресЭлектроннойПочты);    

    Пользователь.SetInfo();
    
    Пользователь.AccountDisabled=найти(строка.имяAD, "переведен")<>0 или найти(строка.имяAD, "уволен")<>0;
    
    Пользователь.SetInfo();
    
    возврат пользователь;
    
конецФункции

функция создатьУчетнуюЗаписьAD(имяAD, парольAD) экспорт
    Перем Пользователь,Пароль,Домен,Стр,Контроллер,Отбор,Подразделение,Группа;

    Корень=МС_РаботасAD.ПолучитьLDAPОбъект("LDAP://RootDSE",Пользователь,Пароль);
    контейнер = получитьCOMОбъект("LDAP://cn=Users,"+корень.Get("defaultNamingContext"));

    ПользовательAD = контейнер.Create("User", "cn=" + имяAD);
    ПользовательAD.Put("sAMAccountName", имяAD);
    ПользовательAD.SetInfo();
    попытка
        ПользовательAD.SetPassword(парольAD);
        ПользовательAD.Put("PasswordExpirationDate",общегоназначения.ДобавитьИнтервал(текущаядата(),Перечисления.Периодичность.День,2));
        Пользователь.SetInfo();

    исключение
        Пользователь.SetInfo();
    конецПопытки;
    //добавляем в группы
    //   Группа.Add(Пользователь.ADSPath);
    
    возврат пользовательAD;
конецФункции
1 PVS_Mtl
 
08.06.15
09:56
Up
2 vde69
 
08.06.15
10:03
1. где выполняется код? клиент или сервер?
2. LDAP - требует прав...
3. может так лучше:

http://catalog.mista.ru/public/22314/
3 PVS_Mtl
 
08.06.15
10:16
1. Код располагается в модуле менеджера регистра сведений. Вызывается при нажатии кнопки на панели формы РС. В перспективе - из регламентного задания. Клиент-сервер, клиент толстый, полагаю что код выполняется на клиенте. Поправьте, если ошибаюсь (как определить, выполняется код на сервере или клиенте - в стеке вызовов не отображается?).
2. Подскажите, а какие права нужны/как можно модифицировать код, чтобы все-таки запись происходила? Начальник отдела выступает за LDAP, и хотелось бы до конца "добить" именно этот вариант. Прав, под которыми вручную правятся записи в AD, недостаточно?
3. Спасибо. Если не удастся реализовать п.2, буду пробовать.
4 PVS_Mtl
 
08.06.15
10:56
Подскажите, где и какие права нужно добавить, чтобы заработал вариант через LDAP? Up
5 PVS_Mtl
 
08.06.15
12:28
Вверх
6 PVS_Mtl
 
08.06.15
13:17
Up
7 sdf
 
08.06.15
14:21
(0)
попробуйте так (у меня работает)

dso = ПолучитьCOMОбъект("LDAP:");    
Пользователь = dso.OpenDSObject(ADsPath, User, Password, 1);
//где ADsPath = текст = "LDAP://CN="+предИмяAD+",CN=Users,DC=Metall1C,DC=local"
8 PVS_Mtl
 
08.06.15
15:21
(7) делаю так, со своей машины, из-под учетной записи своей (лок админа), пишу имя админа сервера AD и его пароль, на строке dso.OpenDSObject ошибка: неверное имя пользователя или пароль. Имя админа пишу и Домен\ИмяАдмина, и просто ИмяАдмина - не действует.
9 PVS_Mtl
 
08.06.15
15:22
точнее: имя пользователя или пароль не опознаны
10 PVS_Mtl
 
09.06.15
07:08
Подскажите, в чем может быть причина?
11 vde69
 
09.06.15
08:11
пароль и логин - это доменная учетка, не локальная а именно доменная!!! (имя домена в ней есть)
12 PVS_Mtl
 
09.06.15
09:34
(11) да, пишу с именем домена, ту, под которой захожу на сервер размещения AD (админскую доменную) - ошибка: имя пользователя или пароль не опознаны.
Если пишу свою учетку (также с именем домена), пароль и имя опознаны, но не хватает прав на setinfo() (я не админ).
Есть подозрение, что админский пароль и имя не опознаны, т.к. в имени есть кириллические символы. Может такое быть?
13 PVS_Mtl
 
09.06.15
12:12
Завели на сервере AD новую админскую учетку, в имени только латиница, дали необходимые права. Объект создается
Пользователь = dso.OpenDSObject(ADsPath, User, Password, 1);

а Пользователь.SetInfo() не проходит - опять та же ошибка:
Присоединенное к системе устройство не работает.
14 vde69
 
09.06.15
12:15
(13) конфликт с чем-то, например пароль слишком простой :) или такой логин уже есть, или еще чего...
15 PVS_Mtl
 
11.06.15
12:30
ошибку получаю при "правке" своей учетной записи в AD (а точнее, при перезаписи указанных полей на те же самые значения, что у них и есть)
16 PVS_Mtl
 
15.06.15
09:28
Up
17 PVS_Mtl
 
23.06.15
09:11
Проблема решена. Если кому-то впоследствии понадобится:
1. оказалось, что ошибка возникает только при попытке редактировать некоторые атрибуты пользователя в AD (т.н. RDN) - такие, как name и/или cn. Если код по их установке закомментировать, ошибка исчезает. Их исправляем совсем другим методом - MoveHere.
2. Функция создания ком-объекта LDAP с возможностью авторизации необходима для работы функционала.
Спасибо за участие.