вторник, 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