none
скрипт при создании контакта в АД не добавляет некоторых атрибутов RRS feed

  • Общие обсуждения

  •  Доброго дня. Стоит задача - осуществлять синхронизацию 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

    'Получение данных из Domain1

    Set objConnectionDomain1 = CreateObject("ADODB.Connection")
    objConnectionDomain1.Provider = "ADsDSOObject"
    objConnectionDomain1.Properties("User ID") = "Domain1\user"
    objConnectionDomain1.Properties("Password") = "Password"
    objConnectionDomain1.Properties("Encrypt Password") = "True"
    objConnectionDomain1.Properties("ADSI Flag") = 1
    objConnectionDomain1.Open "Active Directory Provider"

    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


    'Получение данных из Domain2

    Set objConnectionDomain2 = CreateObject("ADODB.Connection")
    objConnectionDomain2.Provider = "ADsDSOObject"
    objConnectionDomain2.Properties("User ID") = "Domain2\user"
    objConnectionDomain2.Properties("Password") = "Password"
    objConnectionDomain2.Properties("Encrypt Password") = "True"
    objConnectionDomain2.Properties("ADSI Flag") = 1
    objConnectionDomain2.Open "Active Directory Provider"

    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"))

    sAlias=Split(RSDomain1("mail"),"@")
    Contact.Put "sn", RSDomain1("displayname")
    Contact.Put "givenName", RSDomain1("displayname")
    Contact.Put "DisplayName", RSDomain1("DisplayName")
    Contact.Put "mail", RSDomain1("mail")
    Contact.PutEx "Description", RSDomain1("Description")
    Contact.Put "targetAddress", "SMTP:" & RSDomain1("mail")
    Contact.Put "mailnickname", sAlias(0)
    Contact.Put "l", RSDomain1("l")
    Contact.Put "title", RSDomain1("title")
    Contact.Put "physicalDeliveryOfficeName", RSDomain1("physicalDeliveryOfficeName")
    Contact.Put "Company", RSDomain1("company")
    Contact.Put "ipPhone", RSDomain1("ipPhone")
    Contact.Put "mobile", RSDomain1("mobile")
    Contact.Put "telephoneNumber", RSDomain1("telephoneNumber")
    Contact.Put "facsimileTelephoneNumber", RSDomain1("facsimileTelephoneNumber")
    Contact.Put "st", RSDomain1("st")
    Contact.Put "postalCode", RSDomain1("postalCode")
    Contact.Put "postOfficeBox", RSDomain1("postOfficeBox")
    Contact.Put "department", RSDomain1("department")
    Contact.Put "homePhone", RSDomain1("homePhone")
    Contact.SetInfo

    End Function
    3 февраля 2009 г. 14:12

Все ответы

  • дополню.
    Если отказаться от использования фунции (или процедуры) и перенести ее код в тело скрипта в место ее вызова и определить переменные как 
    company = Domain1("company")
     title = Domain1("title")
     desc = Domain1("description")
     dispn =  Domain1("displayname")
     mail = Domain1s("mail")
     и т.п. и использовать эти переменные вместо Domain1("значение") то контакты создаются нормально.

    Т.е. где-то я ошибаюсь при передаче значений при вызове функции.....
    4 февраля 2009 г. 8:54
  •  If a Function procedure has no arguments, its Function statement must include an empty set of parentheses. Причем и в строке определения функции, и при применении директивы Call. А лучше, на мой взгляд, здесь использовать процедуру и вызывать ее просто по имени (без Call).
    4 февраля 2009 г. 9:55
    Модератор
  •  с функциями разобрался, но возник еще один вопрос:
    как составить правильно запрос, чтобы выбрать объекты со всего леса?
    т.е. если я обращаюсь к 'GC://192.168.10.1/DC=Domain1,DC=LCL' , где domain1 корень леса, то выдаются объекты и из дочерних доменов но не все, часть объектов (пользователей например) отсутствует. параметр subtree, как я понял указывает смотреть только на вложенные OU.

    Если есть документация по данному вопросу, было бы совсем прекрасно.
    6 февраля 2009 г. 14:19