Работаю я в компании, в которой количество сотрудников имеющих электронную почту стремится к бесконечности. Конечно же, все эти люди есть в AD с именами и фамилиями. И в очередной раз, когда я полез смотреть адрес электронной почты сотрудника на корпоративный портал, мне это надоело и я задумался об импорте контактов в Opera из AD.
Поиск в яндексогуглах мне ничего не дал, поэтому я решил заниматься пионерством. Для начала я заглянул в файл contacts.adr, который хранится в папке профиля и понял, что он хранится в кодировке UTF-8 и имеет определенную структуру:
ID, NAME, MAIL и т.п. вопросов не вызывают. Поле CREATED хранит по всей видимости дату и время создания контакта, но для меня она не важна, и поэтому я туда решил записывать конкретное значение, взятое из готового файла.
Настало время приступить к непосредственно созданию инструмента импорта. Поискав в сети примеры работы с AD, наваял это:
Проще говоря, делаем запрос к домену и берем оттуда имя, почту и телефонный номер сотрудника. Затем сортируем всё по адресу электронной почты и, отсекая записи с пустыми адресами или пустыми именами (у меня почему-то такие были), записываем всё это в файл, постоянно увеличивая ID контакта. ID, возможно, имеет смысл начинать не с единицы, а с большего числа, т.к. это позволит оставить в адресной книге уже существующие контакты.
Сохранил этот… кхм… код в файле ad.js и запустил командой cscript ad.js из консоли.
Получив заветный файл, я изменил ему кодировку с помощью notepad++ на UTF8 и заменил при закрытой Опере файл в папке профиля.
В итоге получил несколько сотен контактов у себя в адресной книги легким движением руки :)
Также, если в AD хранится отдел, в котором работает сотрудник, можно заморочиться и рассовать контакты по папкам с помощью «тэга» #FOLDER. Пытливый читатель при желании может сам придумать как это сделать :)
Конечно, наверное, существует более легкий и элегантный способ сделать то же самое, но мой велосипедик, созданный за 10 минут, довёз меня именно туда куда мне было нужно.
Поиск в яндексогуглах мне ничего не дал, поэтому я решил заниматься пионерством. Для начала я заглянул в файл contacts.adr, который хранится в папке профиля и понял, что он хранится в кодировке UTF-8 и имеет определенную структуру:
- #CONTACT
- ID=1
- NAME=Иванов Иван Иваныч
- URL=
- CREATED=1287730972
- DESCRIPTION=
- MAIL=ivanov@domain.com
- PHONE=
- FAX=
- POSTALADDRESS=
- PICTUREURL=
- ICON=Contact0
- #CONTACT
- ID=2
- NAME=Петров Петр Петрович
- URL=
- CREATED=1292317914
- DESCRIPTION=
- MAIL=petrov@domain.com
- PHONE=
- FAX=
- POSTALADDRESS=
- PICTUREURL=
- ICON=Contact0
ID, NAME, MAIL и т.п. вопросов не вызывают. Поле CREATED хранит по всей видимости дату и время создания контакта, но для меня она не важна, и поэтому я туда решил записывать конкретное значение, взятое из готового файла.
Настало время приступить к непосредственно созданию инструмента импорта. Поискав в сети примеры работы с AD, наваял это:
- var rootDSE, domainNC, connection, command, recordset;
- var fso, f1;
- rootDSE = GetObject("LDAP://rootDSE");
- domainNC = rootDSE.Get("defaultNamingContext");
- connection = new ActiveXObject("ADODB.Connection");
- connection.Open("Provider=ADsDSOObject;");
- command = new ActiveXObject("ADODB.Command");
- command.ActiveConnection = connection;
- command.CommandText =
- "SELECT displayname,mail,telephoneNumber FROM 'LDAP://"+domainNC+"' WHERE objectClass = 'User'"
- command.Properties("Cache Results") = false;
- command.Properties("Page Size") = 100;
- command.Properties("Sort On") = "mail";
- command.Properties("Timeout") = 0;
- recordset = command.Execute();
- fso = new ActiveXObject("Scripting.FileSystemObject");
- f1 = fso.CreateTextFile("contacts.adr", true);
- i = 1;
- while (! recordset.EOF) {
- if ((recordset.Fields("mail").Value != null) && (recordset.Fields("displayname").Value != null))
- {
- f1.WriteLine("#CONTACT");
- f1.WriteLine(" ID=" + i);
- f1.WriteLine(" NAME=" + recordset.Fields("displayname").Value);
- f1.WriteLine(" URL=");
- f1.WriteLine(" CREATED=1292317914");
- f1.WriteLine(" DESCRIPTION=");
- f1.WriteLine(" MAIL=" + recordset.Fields("mail").Value);
- f1.WriteLine(" PHONE=" + recordset.Fields("telephoneNumber").Value);
- f1.WriteLine(" FAX=");
- f1.WriteLine(" POSTALADDRESS=");
- f1.WriteLine(" PICTUREURL=");
- f1.WriteLine(" ICON=Contact0");
- }
- recordset.MoveNext();
- i = i + 1;
- }
- f1.Close();
- connection.Close();
Проще говоря, делаем запрос к домену и берем оттуда имя, почту и телефонный номер сотрудника. Затем сортируем всё по адресу электронной почты и, отсекая записи с пустыми адресами или пустыми именами (у меня почему-то такие были), записываем всё это в файл, постоянно увеличивая ID контакта. ID, возможно, имеет смысл начинать не с единицы, а с большего числа, т.к. это позволит оставить в адресной книге уже существующие контакты.
Сохранил этот… кхм… код в файле ad.js и запустил командой cscript ad.js из консоли.
Получив заветный файл, я изменил ему кодировку с помощью notepad++ на UTF8 и заменил при закрытой Опере файл в папке профиля.
В итоге получил несколько сотен контактов у себя в адресной книги легким движением руки :)
Также, если в AD хранится отдел, в котором работает сотрудник, можно заморочиться и рассовать контакты по папкам с помощью «тэга» #FOLDER. Пытливый читатель при желании может сам придумать как это сделать :)
Конечно, наверное, существует более легкий и элегантный способ сделать то же самое, но мой велосипедик, созданный за 10 минут, довёз меня именно туда куда мне было нужно.