Импортируем контакты в Opera из Active Directory

    Работаю я в компании, в которой количество сотрудников имеющих электронную почту стремится к бесконечности. Конечно же, все эти люди есть в AD с именами и фамилиями. И в очередной раз, когда я полез смотреть адрес электронной почты сотрудника на корпоративный портал, мне это надоело и я задумался об импорте контактов в Opera из AD.

    Поиск в яндексогуглах мне ничего не дал, поэтому я решил заниматься пионерством. Для начала я заглянул в файл contacts.adr, который хранится в папке профиля и понял, что он хранится в кодировке UTF-8 и имеет определенную структуру:

    1. #CONTACT
    2.  ID=1
    3.  NAME=Иванов Иван Иваныч
    4.  URL=
    5.  CREATED=1287730972
    6.  DESCRIPTION=
    7.  MAIL=ivanov@domain.com
    8.  PHONE=
    9.  FAX=
    10.  POSTALADDRESS=
    11.  PICTUREURL=
    12.  ICON=Contact0
    13.  
    14.  #CONTACT
    15.  ID=2
    16.  NAME=Петров Петр Петрович
    17.  URL=
    18.  CREATED=1292317914
    19.  DESCRIPTION=
    20.  MAIL=petrov@domain.com
    21.  PHONE=
    22.  FAX=
    23.  POSTALADDRESS=
    24.  PICTUREURL=
    25.  ICON=Contact0


    ID, NAME, MAIL и т.п. вопросов не вызывают. Поле CREATED хранит по всей видимости дату и время создания контакта, но для меня она не важна, и поэтому я туда решил записывать конкретное значение, взятое из готового файла.

    Настало время приступить к непосредственно созданию инструмента импорта. Поискав в сети примеры работы с AD, наваял это:

    1. var rootDSE, domainNC, connection, command, recordset;
    2. var fso, f1;
    3.  
    4. rootDSE = GetObject("LDAP://rootDSE");
    5. domainNC = rootDSE.Get("defaultNamingContext");
    6.  
    7. connection = new ActiveXObject("ADODB.Connection");
    8. connection.Open("Provider=ADsDSOObject;");
    9.  
    10. command = new ActiveXObject("ADODB.Command");
    11. command.ActiveConnection = connection;
    12.  
    13. command.CommandText = 
    14. "SELECT displayname,mail,telephoneNumber FROM 'LDAP://"+domainNC+"' WHERE objectClass = 'User'"
    15. command.Properties("Cache Results") = false;
    16. command.Properties("Page Size") = 100;
    17. command.Properties("Sort On") = "mail";
    18. command.Properties("Timeout") = 0;
    19.  
    20. recordset = command.Execute();
    21.  
    22. fso = new ActiveXObject("Scripting.FileSystemObject");
    23. f1 = fso.CreateTextFile("contacts.adr", true);
    24.  
    25. = 1;
    26.  
    27. while (! recordset.EOF) {
    28.  
    29. if ((recordset.Fields("mail").Value != null) && (recordset.Fields("displayname").Value != null))
    30. {
    31. f1.WriteLine("#CONTACT");
    32. f1.WriteLine(" ID=" + i);
    33. f1.WriteLine(" NAME=" + recordset.Fields("displayname").Value);
    34. f1.WriteLine(" URL=");
    35. f1.WriteLine(" CREATED=1292317914");
    36. f1.WriteLine(" DESCRIPTION=");
    37. f1.WriteLine(" MAIL=" + recordset.Fields("mail").Value);
    38. f1.WriteLine(" PHONE=" + recordset.Fields("telephoneNumber").Value);
    39. f1.WriteLine(" FAX=");
    40. f1.WriteLine(" POSTALADDRESS=");
    41. f1.WriteLine(" PICTUREURL=");
    42. f1.WriteLine(" ICON=Contact0");
    43. }
    44.   recordset.MoveNext();
    45.   i = i + 1;
    46. }
    47. f1.Close();
    48.  
    49. connection.Close();

    Проще говоря, делаем запрос к домену и берем оттуда имя, почту и телефонный номер сотрудника. Затем сортируем всё по адресу электронной почты и, отсекая записи с пустыми адресами или пустыми именами (у меня почему-то такие были), записываем всё это в файл, постоянно увеличивая ID контакта. ID, возможно, имеет смысл начинать не с единицы, а с большего числа, т.к. это позволит оставить в адресной книге уже существующие контакты.
    Сохранил этот… кхм… код в файле ad.js и запустил командой cscript ad.js из консоли.

    Получив заветный файл, я изменил ему кодировку с помощью notepad++ на UTF8 и заменил при закрытой Опере файл в папке профиля.
    В итоге получил несколько сотен контактов у себя в адресной книги легким движением руки :)

    Также, если в AD хранится отдел, в котором работает сотрудник, можно заморочиться и рассовать контакты по папкам с помощью «тэга» #FOLDER. Пытливый читатель при желании может сам придумать как это сделать :)

    Конечно, наверное, существует более легкий и элегантный способ сделать то же самое, но мой велосипедик, созданный за 10 минут, довёз меня именно туда куда мне было нужно.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 7

      0
      А что мешало Уважаемому просто использовать LDAP?
        +1
        В каком смысле?
        0
        Увидел сразу две проблемы в коде:
        1. Строка 16. Page Size = 100. Если в AD больше 100 учеток, то они не выгрузятся
        2. Строка 33. Не все учетки могут иметь заполенное поле displayName. На этот случай лучше сделать проверку на его пустоту и тогда брать данные из CN.
          0
          1. Поверьте, выгрузилось несколько сотен. PageSize видимо не за это отвечает.
          2. Это да, возможно.
            0
            Отвечает, в сочетании с SizeLimit. По умолчанию, SizeLimit = 1000. Из-за этого могут возникнуть проблемы с большим количеством записей. В примерах обычно про это не пишут.

            Проще оба параметра выставить одинаковыми и достаточно большими.
              0
              Возможно, не буду спорить, т.к. не знаю.
              Да и не программист я :)
            0
            If you do specify a Page Size, however, Active Directory will return the first x items, then pause for a split second and return the next x items, then pause for a split second, and so on. This will continue until all the items have been returned.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое