Имя: Пароль:
1C
1С v8
Выгрузка дожности сотрудника в AD из ЗУПа
, ,
0 ILNIK
 
12.11.14
12:02
Народ, поделитесь, пожалуйста, готовым кодом.

Нужно подключиться к AD, пробежаться по пользователям и сравнить у каждого из них должность и подразделение из AD с должностью и подразделением в ЗУПе.
Если они различаются, то исправить в AD.

PS: Сделал обработку, которая загружает данные(эл. адрес) из AD в ЗУП. Теперь надо сделать обратную синхронизацию. Много примеров по созданию пользователей в AD, а мне надо не создавать, а искать их и перезаписывать реквизиты.
Нашел пример через скрипт, но мне нужен код на языке 1с.

Заранее спасибо.
1 Господин ПЖ
 
12.11.14
12:03
>Нашел пример через скрипт, но мне нужен код на языке 1с.

гугль-переводчик все сделает
2 vde69
 
12.11.14
12:04
3 ILNIK
 
12.11.14
12:24
(2) уже видел эту статью.
Во-первых там используется WinNT,
а во-вторых там нет  то что мне нужно.
(там примеры, как удалить пользователя или добавить - это совсем другие команды)
4 ILNIK
 
12.11.14
13:49
up
5 chepsoid
 
12.11.14
13:51
есть такая програмка IT Itilium вот она вроде как делает синхронизацию, может там код есть, у меня он не установлен, надо искать, помню что было там такое.
6 chepsoid
 
12.11.14
13:52
p.s. могу ошибиться
7 Otkr
 
12.11.14
13:54
(5) В Итилиуме данные из АД берутся, но не пишутся
8 ILNIK
 
12.11.14
13:58
(5) Итилиум у нас был на прошлой работе.
Такую функцию не использовали, если она вообще там есть.
Но аккаунт автоматически подбирался по ФИО
9 Demetres
 
12.11.14
14:09
Для поиска можно использовать запросы:

CommandText = "<LDAP://" + ПутьКВетке + ">;(" + ФильтрЗапросаAD + ");AdsPath,Title,Department;subtree";
ВыборкаАД     = conn.Execute(CommandText);        

Пока НЕ ВыборкаАД.EOF() Цикл
    
    Попытка
        rs = ПолучитьCOMОбъект(ВыборкаАД.Fields(0).value);
        ДолжностьАД = ВыборкаАД.Fields(1).value;
        ПодразделениеАД = ВыборкаАД.Fields(2).value;
    Исключение
        ТекстОшибки = "При получении пользователя из AD возникла ошибка: " + ОписаниеОшибки();
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
        ВыборкаАД.MoveNext();
        Продолжить;
    КонецПопытки;
    
    ВыборкаАД.MoveNext();
    
КонецЦикла;
10 Demetres
 
12.11.14
14:19
И вот ещё в нагрузку:
http://www.script-coding.com/Python/LDAP.html
очень полезная статья, много от туда брал
11 ILNIK
 
12.11.14
14:20
(9) Если я найду пользователя AD таким запросом, то смогу ли я изменить его реквизиты с помощью метода PUT() и SetInfo()?

Или как вариант все равно нужно будет в цикле получить пользователя с помощью OpenDSObject(), а потом уже менять реквизиты?
12 Demetres
 
12.11.14
14:24
(11) У нас не PUT(), SetInfo(), OpenDSObject() не используются, данные пишутся в АД через команды PowerShell. По этому тут могу вам посоветовать только эксперимент :)
На мой взгляд SetInfo() должен работать, если права есть. Потом напишите что получилось.
13 ILNIK
 
12.11.14
17:05
Сейчас появилась еще одна проблема. Перенесли базу на секретный сервер, который не входит в домен и в итоге код, которые ранее работал (вытаскивал электронку из AD) перестал работать. Не удается подключиться к AD.
Все порты открыли permit any to any
14 Otkr
 
13.11.14
07:57
(13) Код подключения к АД выполняется НаСервере?
15 ILNIK
 
13.11.14
09:12
(14) Это обычное приложение 8.2.19.83. ЗУП 2.5.86.2.
Запускаю на своем компе - все работает.
Запускаю на сервере - не хочет подключаться.
Как подключиться к AD, если сервер не входит в домен?
16 ILNIK
 
13.11.14
10:01
(15) Эту проблему решил, прописав контроллер домена и пользователя через собаку+домен.
Теперь другая ошибка - не выполняется запрос к AD:

//АДСИ=Новый COMОбъект("ADSystemInfo");

//Контроллер=АДСИ.GetAnyDCName();

//Домен=АДСИ.DomainDNSName;

Контроллер="ИмяСервераAD.int.xxxxxxxxxx.ru";

Домен="int.xxxxxxxxxx.ru";    

Пользователь=""+ПользовательAD+"@"+Домен;



ДСО=ПолучитьCOMОбъект("LDAP:");

Корень=ДСО.OpenDSObject("LDAP://"+Контроллер+"/RootDSE", Пользователь, ПарольAD,1);



ТекстЗапроса="<LDAP://";


Если ПустаяСтрока(Домен)=Истина Тогда

Провайдер="Provider=ADSDSOObject;User Id="+ПользовательAD+"@"+Домен+";Password="+ПарольAD;

ТекстЗапроса=ТекстЗапроса+Стр+">";

Иначе

Провайдер="Provider=ADSDSOObject;";

ТекстЗапроса=ТекстЗапроса+Корень.Get("defaultNamingContext")+">";

КонецЕсли;

                

Отбор=";(&(objectClass=user));AdsPath;subTree";

ТекстЗапроса=ТекстЗапроса+Отбор;

                              

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

База.Open("Provider=ADSDSOObject;",  ПользовательAD, ПарольAD);            

                              

Команда = Новый COMОбъект("ADODB.Command");                              

Команда.CommandText = ТекстЗапроса;          

Команда.ActiveConnection = База;

Команда.Properties("Page Size").Value = 1000;        //set the Paged Results value to 1000 (AD standard)

Команда.Properties("Cache Results").Value = Истина;  //Кэшировать результат

                

                

Попытка

                Записи = Команда.Execute();

Исключение

                Описание = ОписаниеОшибки();

                Сообщить(Описание, СтатусСообщения.Важное);

                ЗаписьЖурналаРегистрации("Ошибка выгрузки в оутлук " + Описание + "", УровеньЖурналаРегистрации.Ошибка);

                Возврат;

КонецПопытки;





Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Active Directory): The specified domain either does not exist or could not be contacted.
17 Balabass
 
13.11.14
10:06
Жду результат твоей работы.
Обязательно исходный код в студию!
Мне это тоже нужно.
18 ILNIK
 
13.11.14
11:35
Короче не хочет выполняться запрос с помощью ADODB.Connection.
Уже кучу всего перепробовал
Основная теорема систематики: Новые системы плодят новые проблемы.