вторник, 1 июня 2010 г.

Контакты в Sharepoint

Многим известен такой неплохой продукт, как Microsoft Sharepoint Service (он же WSS). Внешне вполне привлекательный и удобный инструмент становится крайне несговорчивым, когда знакомишься с ним поближе и пытаешь выдавить из него хоть чуточку полезного функционала. Вот и я столкнулся с тем, что надо бы как-то удобно организовать доступ к информации о пользователях ЗАО "Тюменьнефтегазпроект" посредством WSS, но как?

Как обычно в таком случае поступают все айтишники, сперва изучил встроенные возможности. Поплевался в сторону и начал искать альтернативные решения в google'е. Опять холостой выхлоп. Найденные решения или скупы на функционал или платные, а за такую фишку я сам платить не согласен и руководство убеждать в необходимости ее купить также не намерен. В итоге, как всегда, взял в руки скальпель и начал ваять новую веб-часть.

Пример отображения веб-части с результатом поиска по фамилии:

Требования к веб-части у меня были достаточно простые или скорее, очевидные, а именно:
  • получение списка пользователей из Active Directory;
  • отображение списка в виде дерева;
  • отображение списка в виде списка (простите за такой оборот);
  • поиск по фамилии, имени, отчеству;
  • отображение максимально полной информации о пользователе.
Дополнительными требованиями выдвинул:
  • возможность отображать информацию о пользователе выборочно, например, в зависимости от прав доступа;
  • возможность интегрироваться в внешними приложениями посредством xml/xsl.

Как это работает
Прежде всего, веб-часть проверят все входные параметры, пути к XSL файлам, параметры LDAP запроса к серверу и т.п. При удачной проверке обращается к домену и запрашивает у него информацию о пользователях. Сохраняет все в XML файле, а потом натравливает на него XSL файлы для преобразования в удобоваримый вид.

Что для этого нужно
Веб-часть просит большое количество входных параметров, большая часть которых прописана изначально и половина из них нарочно неверно. Начнем по-порядку, исходными параметрами для веб-части являются:
  • Атрибуты
  • Фильтр
  • Ключи
  • Домен
  • Имя пользователя
  • Пароль пользователя
  • Период обновления
  • Ориентация
  • Высота дерева
  • Ссылка на XML файл
  • Ссылка на XSL файл для дерева
  • Ссылка на XSL файл для контакта
  • Ссылка на XSL файл для списка
  • Ссылка на CSS файл
Отдельно остановлюсь на каждом параметре.
Атрибуты - это атрибуты объекта User, которые будут запрошены LDAP запросом.
Фильтр - это фильтр LDAP запроса, чтобы не выбрать лишние объекты.
Ключи - это ключевые атрибуты, по которым будет построено дерево пользователей (они передаются в XSL файл).
Домен - это адрес домена, можно указать и порт по которому надо обращаться к домену.
Имя пользователя - имя пользователя от имени которого будет выполнен запрос к домену (чтобы не давать лишние права системным пользователям).
Пароль пользователя - пароль пользователя от имени которого будет выполнен запрос к домену.
Период обновления - это период обновления XML файла в часах, т.е. если с момента последнего обновления XML файла не прошло указанное количество часов, то он не будет обновляться, а просто возьмет те данные, которые в нем уже есть.
Ориентация - это возможность спланировать размещение элементов веб-части, обычно Left2Right.
Высота дерева - это высота дерева в пикселях, по сути, от нее зависит и высота веб-части.
Ссылка на XML файл - это относительный путь к XML файлу в котором будет храниться результат LDAP запроса. К файлу надо дать соответствующие права доступа всем пользователям, которые заходят на сайт (в архиве файл AlxdDirectory.xml).
Ссылка на XSL файл для дерева - это относительный путь к XSL файлу, который преобразует XML файл в подходящий для формирования дерева формат (в архиве файл AlxdTreeView.xsl).
Ссылка на XSL файл для контакта - это относительный путь к XSL файлу, который преобразует XML файл в карточку контакта (визитку). В нем можно фантазировать без ограничений, например я разместил в нем даже ссылку на фотографию сотрудника (в архиве файл AlxdContact.xsl).
Ссылка на XSL файл для списка - это относительный путь к XSL файлу, который преобразует XML файл в выпадающий список (в архиве файл AlxdSelect.xsl).
Ссылка на CSS файл - это относительный путь к CSS файлу, который позволяет оформить веб-часть по своему усмотрению (в архиве файл AlxdContactNavigator.css).
Все XML, XSL и CSS, а также JPG файлы (все есть в архиве) лучше разместить на сервере IIS в одной папке, например, мне было удобно разместить по адресу:
Указанные выше адреса соответствуют путям:
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\AlxdContactNavigator\AlxdDirectory.xml
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\AlxdContactNavigator\AlxdTreeView.xsl
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\AlxdContactNavigator\AlxdContact.xsl
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\AlxdContactNavigator\AlxdSelect.xsl
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\AlxdContactNavigator\AlxdContactNavigator.css
В эту же папку разумно разместить дополнительные файлы, которые могут быть востребованы XSL преобразованиями, например, картинки.

Преимущества веб-части:
1. Бесплатно.
2. Позволяет настроить запрос и отображение как угодно сложно посредством XSL.
3. Позволяет интегрироваться во внешние системы, например, использовать данные из базы данных автоматического турникета на проходной.

Недостатки веб-части:
1. Пока что не умеет соединяться с другими веб-частями.
2. Нет механизма оповещения о приходе/уходе сотрудника.
3. Может медленно работать, если поставить маленький период обновления (только зачем?) или база пользователей весьма большая.

Установка веб-части AlxdContactNavigator осуществляется с помощью bat'ника setup.bat с ключом -i. Удаление - ключ -u.

Настройка веб-части сводится к указанию правильных входных параметров. Например, есть домен dmn.local из которого надо извлечь информацию о пользователях.
Во-первых: в параметрах веб-части атрибуты, фильтр, ключи можно изначально не трогать, сразу вписать домен: LDAP://dmn.local.
Во-вторых: обязательно указать имя пользователя от имени которого будет стучаться в домен, иначе ничего не получим, например, userlist и пароль пользователя - 123.
В-третьих: по умолчанию все пути к XML, XSL и CSS ложные, скажем, c:\AlxdDirectory.xml, поэтому их сразу надо поменять, например, на /AlxdContactNavigator/AlxdDirectory.xml и т.д.

Пример заполнения параметров веб-части:

В итоге получил страничку WSS на которой отражается веб-часть с деревом контактов, выбирая который, получаю подробную визитку выбранного пользователя с фотографией.


У нас, помимо простого отражения дерева контактов, возникла еще одна потребность, отразить присутствие или отсутствие сотрудника на работе. Данные об этом хранятся в базе автоматического турникета. Мой коллега написал сервис, который из базы турникета перегоняет данные в базу MS SQL. А потом уже из этой базы формирует XML файл PassThrough.xml на текущий день. Мне осталось только дописать в XSL код, который извлекает данные из доп. XML файла и консолидирует их. В итоге, все пользователи изначально отображаются синими иконками, если пришел на работу - зелеными, если ушел - красными. Наглядно. Удобно. Просто.
Пример XSL консолидирующего данные из двух XML файлов также вложен в архив.

Upd: Исходник AlxdContactNavigator.source.zip 

22 комментария:

  1. Крутяк. Молодец. Не бережешь ты себя все о народе думаешь!!!

    ОтветитьУдалить
  2. отличная статья.
    кстати, был вариант решения, использую "замечательнейшую" вещь - МС Коммуникатор - он в шарепойнте сам статусы отображает. безо всяких баз турникета

    ОтветитьУдалить
  3. А, кстати, у тебя фотографии прикручены к AD или к порталу???

    ОтветитьУдалить
  4. А вот и Alxd! : )))) Привет от maestro!

    Глянь в моем блоги статьи- там упоминания про atable : ))))

    Алекс- не будь фашистом- отладь атабл под 2010 (а потом и 2011)- а то непонятно к4ак дальше жить : )))

    И верни интеграцию с Ексель, как было раньше : )))

    А вообще, привет : )))) Рад тебя тут видеть : )))

    ОтветитьУдалить
  5. 2 Olaf
    Фотографии лежат отдельно в каталоге. Каждая фотография имеет название формата [ФИО].jpg. Ссылка на фотографию из контакт навигатора получается локальная, но меня это не смущает.

    ОтветитьУдалить
  6. 2 maestro
    А нужен ли ATable для AutoCAD 2010 и 2011? В самом AutoCAD таблицы вроде достаточно мощными стали? (это тема для целой дискуссии)

    ОтветитьУдалить
  7. Здравствуйте! Я понимаю, наглость, но не могли бы поделиться исходниками? Есть необходимость доработки для наших целей! Если такая возможность есть и не противоречит вашим принципам, буду крайне признателен, если вышлите на af1986@mail.ru
    Заранее благодарен, Алексей

    ОтветитьУдалить
  8. Если отдать исходники, то станет неинтересно. Вы свои идеи у себя реализуете, а я и другие их не увидят :)
    Если есть идеи по дополнению веб-части - пишите!

    ОтветитьУдалить
  9. Подскажите где меняется путь по умолчанию до каталога с фотографиями сотрудников? У Вас по умолчанию file://tngp.local/public/ФИО.jpg

    ОтветитьУдалить
    Ответы
    1. А что написано в AlxdContact.xsl?
      P.S. Бросайте sharepoint, переходите на бесплатную easla.com! Там каталог с фотографиями по-умолчанию :)

      Удалить
    2. Вот тут про фото пользователей: http://easla.com/ru/news/alone/news_id/32

      Удалить
  10. Этот комментарий был удален автором.

    ОтветитьУдалить
  11. Спасибо. Посмотрим что easla

    ОтветитьУдалить
    Ответы
    1. Будут вопросы - пишите, не стесняйтесь!

      Удалить
    2. Здравствуйте. Подскажите при выборке фильтра (&(objectcategory=person)(department=*Управление делами)) выдает ошибку : "Sorry, query filter contains a space. This is unacceptable." Насколько я понял из перевода, то пишет что запрос содержит пробелы, но в запросе пробелов вроде нет. Может на значение так реагировать?

      Удалить
    3. Как это нет пробелов? А как же между словами "Управление" и "делами"? Но похоже это моя ошибка. Судя по https://www.opennet.ru/base/net/ldap_search_filter.txt.html фильтр может содержать пробелы, а я в коде это пресёк.

      Удалить
    4. Выложил исходники. Можете воспользоваться.

      Удалить
  12. Спасибо. Думаю с исходниками у меня возникнет проблема :-) Но все равно спасибо.

    ОтветитьУдалить
    Ответы
    1. Я так давно писал эту веб-часть, что перекомпилировать ее сходу не удалось. Проще поделиться исходниками.
      P.S. Бросайте вы sharepoint, слабенькая система. Только для очень простых решений для малых рабочих групп. Посмотрите в сторону easla.com.

      Удалить
  13. Здравствуйте. Извиняюсь за нескромность, но нигде нормально не могу найти как в PS сделать, чтобы обращаться к определенному LDAP c определенными логином и паролем. Как Вы это реализовывали.

    ОтветитьУдалить
    Ответы
    1. Я же выложил исходники. Смотрите функцию UpdateXml

      Удалить