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