Как стать автором
Обновить

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

Время на прочтение3 мин
Количество просмотров1.9K
Работаю я в компании, в которой количество сотрудников имеющих электронную почту стремится к бесконечности. Конечно же, все эти люди есть в 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 минут, довёз меня именно туда куда мне было нужно.
Теги:
Хабы:
+4
Комментарии7

Публикации