Доброго дня. Стоит задача - осуществлять синхронизацию GAL(глобальной адресной книги) между двумя лесами. Выявилась проблема, скрипт никак не хочет создавать какие-либо атрибуты у контакта, кроме почтового адреса и имени контакта. Куда смотреть и что копать? P.S. Да, я в курсе что есть MIIS, но только вот он платный, а бесплатный IIFP не работает c Exchange 2007
Алгоритм работы скрипта 1. Подсоединяется к домену1 и скачивает необходимые данные. 2. Подсоединяется к домену2 и скачивает необходимые данные. 3. Берет первую запись из домена1 и сравнивает почтовые адреса со всеми записями домена2 по адресу, если адреса равны, то берет следующую запись из домена1 и т.д. 4. Если адреса не равны и сравнение прошло для всех записей домена2, то по ключу (переменная а) вызывается функция создания контакта.
Сам скрипт.
Option Explicit On Error Resume Next Dim objConnectionDomain1, objCommandDomain1, RSDomain1, objConnectionDomain2, objCommandDomain2, RSDomain2, a
Set objCommandDomain1 = CreateObject("ADODB.Command") Set objCommandDomain1.ActiveConnection = objConnectionDomain1
objCommandDomain1.CommandText = "SELECT description,displayName,mail,l,title,physicalDeliveryOfficeName,company,ipPhone,mobile,telephoneNumber, facsimileTelephoneNumber, st, postalCode, postOfficeBox, department, homePhone, targetAddress FROM 'GC://192.168.10.1/DC=Domain1,DC=LCL' WHERE objectClass='contact' AND displayname <> 'SystemMailbox*' AND mail <> 'SystemMailbox*' ORDER BY mail" Set RSDomain1 = objCommandDomain1.Execute
Set objCommandDomain2 = CreateObject("ADODB.Command")
Set objCommandDomain2.ActiveConnection = objConnectionDomain2
objCommandDomain2.CommandText = "SELECT description,displayName,mail,l,title,physicalDeliveryOfficeName,company,ipPhone,mobile,telephoneNumber, facsimileTelephoneNumber, st, postalCode, postOfficeBox, department, homePhone, targetAddress FROM 'GC://192.168.20.1/DC=Domain1,DC=LCL' WHERE mail='*' AND (objectClass='contact' OR objectClass='group' OR objectClass='user') AND displayname <> 'SystemMailbox*' AND mail <> 'SystemMailbox*' ORDER BY mail" Set RSDomain2 = objCommandDomain2.Execute
'Проверка наличия данных в структурах if NOT (RSDomain2.BOF OR RSDomain2.EOF OR RSDomain1.BOF OR RSDomain1.EOF) then
RSDomain1.MoveFirst 'Переходим к началу структуры 1
Do Until RSDomain1.EOF 'Цикл перебирает всю структуру1 до конца
RSDomain2.MoveFirst 'Переходим к началу структуры 2 a=0 Do Until RSDomain2.EOF 'Цикл перебирает всю структуру2 до конца 'Сравнение почтовых адресов if (RSDomain2("mail") <> RSDomain1("mail")) then RSDomain2.MoveNext else a=1 Exit Do 'Выход из цикла если адреса одинаковые end if Loop 'Если адреса не равны и просмотрена вся структура, следовательно необходимо создать контакт. if a=0 then
call ADDCONTACT end if
RSDomain1.MoveNext Loop
end if
Function ADDCONTACT Dim sAlias, Container, Contact Set Container = GetObject("LDAP://OU=test,DC=Domain2,DC=lcl") Set Contact = Container.Create("Contact", "CN=" & RSDomain1("displayname"))
дополню. Если отказаться от использования фунции (или процедуры) и перенести ее код в тело скрипта в место ее вызова и определить переменные как company = Domain1("company") title = Domain1("title") desc = Domain1("description") dispn = Domain1("displayname") mail = Domain1s("mail") и т.п. и использовать эти переменные вместо Domain1("значение") то контакты создаются нормально.
Т.е. где-то я ошибаюсь при передаче значений при вызове функции.....
с функциями разобрался, но возник еще один вопрос: как составить правильно запрос, чтобы выбрать объекты со всего леса? т.е. если я обращаюсь к 'GC://192.168.10.1/DC=Domain1,DC=LCL' , где domain1 корень леса, то выдаются объекты и из дочерних доменов но не все, часть объектов (пользователей например) отсутствует. параметр subtree, как я понял указывает смотреть только на вложенные OU.
Если есть документация по данному вопросу, было бы совсем прекрасно.