Sharepoint – пусть бегут неуклюжи


Да это слова из хорошо известной песенке о дне рождения и о том, что такой день только раз в году. Только речь у нас не о дне рождения Sharepoint 2010, а о том, что не так уж редко в компаниях размещают на корпоративном сайте список именинников или даже персональное поздравление с днем рождения. Персональную страничку можно написать и легко разместить на сайте Sharepoint, а вот как быть со списком именинников, скажем, на текущей неделе?

В Sharepoint нет стандартной Web-части, которая отображала бы список именинников. Разработка собственной Web-части требует затрат времени и сил. Для тех, кто пишет код  для Sharepoint каждый день это не проблема. А как быть остальным?

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

В любом случае, разработка или приобретение, нужны затраты. А какая выгода? Только косметический эффект. Поэтому хочется использовать только стандартные компоненты и приложить минимальные усилия при нулевых финансовых затратах, и чтобы решение было под силу практически любому.

И так!

Задача: отображать список сотрудников    именинников на текущей неделе

Исходные данные:

·         дата рождения сотрудника находится в его учетной записи Active Directory в поле extensionAttribute13 в формате dd.mm.yyyy

·         Sharepoint Server 2010 с настроенным импортом учетных записей из Active Directory.

Решение: Используем обычный настраиваемый список Sharepoint и скрипт на Powershell

Описание

Сначала вопросы и ответы.

Почему дата рождения в атрибуте extensionAttribute13?

Стандартного атрибута BirthDay в схеме Active Directory нет. Поэтому либо надо расширять схему (того не стоит для нашей задачи), либо использовать какой-то другой атрибут (либо использовать иной источник информации). Если установлен Exchange Server, то схема AD уже расширена и есть атрибуты extensionAttribute1-16, которые мы можем использовать по своему усмотрению. Я выбрал для примера атрибут extensionAttribute13. Вы можете взять любой другой.

Можно настроить импорт учетных записей в Sharepoint 2010 так, чтобы отобразить атрибут extensionAttribute13 на атрибут дня рождения, который есть в Sharepoint, но это нам совершенно не нужно для решения нашей задачи, поэтому не тратим на это время.

Почему формат даты dd.mm.yyyy?

Формат даты рождения вы можете взять любой (поправьте преобразование в  скрипте!). В моем примере формат dd.mm.yyyy – в таком виде он взят из кадровой системы и импортирован в AD. Соответствует российскому формату.

Почему Powershell?

Стандартно, просто, мощно и доступно любому администратору. В отличие от exe файла или расширения Sharepoint написанного на C#  скрипт может быть доработан любым администратором под изменившиеся требования.

 

Пошаговое описание решения.

Создаем список «Именинники» типа «Настраиваемый список»

Добавляем поле «Именинник» типа «Пользователь или группа». Выбираем опцию «Только пользователь»

Добавляем поле «День рождения»  типа «Дата и время». Выбираем опцию «Только дата»

Скрываем в списке стандартное поле «Наименование» (оно нам не нужно)

В настройках списка включаем «Управление содержимым»

Переходим обратно в настройки списка и выбираем «Элемент»

Выбираем столбец «Наименование»

Ставим признак «Скрытый»

Создаем новый столбец «Дата рожд.» типа «Вычисляемый»,  возвращаемое значение типа «Дата», значение:

=ТЕКСТ([День рождения];"dd MMMM")

т.е.  получаем отображение даты в виде «19 мая» или «2 декабря».

Создаем новое Представление из столбцов «Именинник» и «Дата рожд.»

                Эти столбцы будут отображаться в Web-части «Именинники» на странице.

Создаем пользователя spsbirthday в AD, от имени которого будет выполняться скрипт

Даем ему права Run as Batch на сервере Sharepoint 2010, где будет выполняться скрипт

Назначаем пользователю spsbirthday права в Sharepoint на изменение списка.

Все – список готов

 

Скрипт выполняется по расписанию

В «Планировщике задач» создаем задачу

Задача выполняется утром каждого понедельника (у нас же список именинников  на неделю, и он не меняется на неделе)

Выполнить программу powershell.exe

Параметры

noprofile c:\scripts\Weekbirthdays.ps1

Задаем пользователя, от имени которого выполняется скрипт.

 

Осталось мелочь – сам скрипт Weekbirthdays.

Загружаем нужные модули:

[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint”)

Add-PSSnapin Microsoft.SharePoint.PowerShell

import-module activedirectory

Задаем сайт, где расположен наш список:

$site = http://sps/

Подключаемся к ферме:

$SiteWeb = Get-SPWeb $site

Теперь вычисляем даты начала и окончания текущей недели (взято из недр Интернета и выглядит красиво!) :

$StartWeekDate = get-date -hour 0 -minute 0 -second 0

$StartWeekDate = $StartWeekDate.AddDays(1-($StartWeekDate).DayOfWeek.value__)

$EndWeekDate = get-date -hour 23 -minute 59 -second 59

$EndWeekDate = $EndWeekDate.AddDays(7-($EndWeekDate).DayOfWeek.value__)

Подключаемся к списку:

$mylist = (Get-SPWeb -identity $site).Lists["Именинники"]

Очищаем список от именинников прошлой недели (день рождения только раз в году!):

$mylist.Items | % { $mylist.GetItemById($_.Id).Delete() }

Получаем список учетных записей пользователей из AD. Берем только не удаленные учетные записи:

$adusers = Get-ADUser -LDAPFilter "(&(&(&(objectCategory=user)(objectClass=user)(extensionAttribute13=*)(!userAccountControl:1.2.840.113556.1.4.803:=2)) ))" -Properties "extensionAttribute13"

В цикле анализируем дату рождения каждого пользователя:

foreach ($aduseritem in $adusers) {

Находим объект пользователя в Sharepoint:

    $user = $SiteWeb.EnsureUser($aduseritem.UserPrincipalName)

    $userValue = new-object Microsoft.SharePoint.SPFieldUserValue($SiteWeb, $user.ID, $user.UserPrincipalName)

                При таком подходе будет не только отображаться ФИО именинника, но и будет работать интеграция с Lync и профилем Sharepoint.

Преобразуем строку даты рождения из AD к типу «Дата и время»:

    $userBirthDay = [datetime]::Parse($aduseritem.extensionAttribute13, [System.Globalization.CultureInfo]::CreateSpecificCulture(“ru-RU”))

Заменяем год даты рождения на текущий год (сравнение дня рождения с неделей в этом году!):

    $userBirthDayNormal = Get-Date -Day $userBirthDay.Day -Month $userBirthDay.Month

Теперь делаем поправку на переход  через 31 декабря:

if ($userBirthDayNormal -lt $StartWeekDate -and $userBirthDayNormal -lt $EndWeekDate ) {

        $userBirthDayNormal = $userBirthDayNormal.AddYears(+1);

    }

    if ($userBirthDayNormal -gt $StartWeekDate -and $userBirthDayNormal -gt $EndWeekDate ) {

        $userBirthDayNormal = $userBirthDayNormal.AddYears(-1);

    }

Проверяем, что дата рождения относится к текущей неделе:

    if ($userBirthDayNormal -ge $StartWeekDate -and $userBirthDayNormal -le $EndWeekDate ) {

Если входит в границы текущей недели, то  добавляем пользователя к списку именинников:

$newItem = $mylist.Items.Add()

    $newItem["Дата рождения"] = $userBirthDayNormal

    $newItem["Именинник"] = $userValue

    $newItem.Update()

Далее переходим к следующей учетной записи в цикле.

Как вы заметили, вместо реальной даты мы берем нормализованную дату, в которой день и месяц соответствуют реальному дню рождения человека, а год заменен на текущий (с поправкой на Новый Год). Это избавляет нас от проблемы раскрытия реального возраста человека: в страничке будет отображаться только день и месяц его рождения. (В принципе реальную дату рождения можно даже не хранить в AD для нашей задачи).

Остается положить скрипт в специально созданную для него директорию. (Права для пользователя!)

Если теперь запустить на выполнение задачу Планировщика с нашим скриптом, то … получим ошибку.

Оказывается пользователю нужно выдать разрешения на использование Sharepoint Powershell. Для этого выполняем команду:

Add-SPShellAdmin –UserName DOMAIN\ spsbirthday  -database guid

где guid соответствует базе контента, в которой расположен наш список. Его можно получить командой:

Get-SPDatabace

Теперь скрипт выполниться успешно и список будет заполнен именинниками недели.

Остается добавить на нужную страницу сайта Web-часть отображения списка «Именинники» и оформить ее по вкусу.

Полный текст скрипта:

 

[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint”)

Add-PSSnapin Microsoft.SharePoint.PowerShell

import-module activedirectory

 

 

$ctesite = "http://sps.rums.bis/"

$SiteWeb = Get-SPWeb $ctesite

 

 

$StartWeekDate = get-date -hour 0 -minute 0 -second 0

$StartWeekDate = $StartWeekDate.AddDays(1($StartWeekDate).DayOfWeek.value__)

 

$EndWeekDate = get-date -hour 23 -minute 59 -second 59

$EndWeekDate = $EndWeekDate.AddDays(7($EndWeekDate).DayOfWeek.value__)

 

 

 

 

$mylist = (Get-SPWeb -identity $ctesite).Lists["Именинники"]

 

#$mylist.Items | % { $_.Delete() }

$mylist.Items | % { $mylist.GetItemById($_.Id).Delete() }

 

 

$adusers = Get-ADUser -LDAPFilter "(&(&(&(objectCategory=user)(objectClass=user)(extensionAttribute13=*)(!userAccountControl:1.2.840.113556.1.4.803:=2)) ))" -Properties "extensionAttribute13"

 

foreach ($aduseritem in $adusers) {

 

    $user = $SiteWeb.EnsureUser($aduseritem.UserPrincipalName)

    $userValue = new-object Microsoft.SharePoint.SPFieldUserValue($SiteWeb, $user.ID, $user.UserPrincipalName)

 

    $userBirthDay = [datetime]::Parse($aduseritem.extensionAttribute13, [System.Globalization.CultureInfo]::CreateSpecificCulture(“ru-RU”))

 

    $userBirthDayNormal = Get-Date -Day $userBirthDay.Day -Month $userBirthDay.Month

   

    if ($userBirthDayNormal -lt $StartWeekDate -and $userBirthDayNormal -lt $EndWeekDate ) {

        $userBirthDayNormal = $userBirthDayNormal.AddYears(+1);

    }

 

    if ($userBirthDayNormal -gt $StartWeekDate -and $userBirthDayNormal -gt $EndWeekDate ) {

        $userBirthDayNormal = $userBirthDayNormal.AddYears(-1);

    }

 

 

    if ($userBirthDayNormal -ge $StartWeekDate -and $userBirthDayNormal -le $EndWeekDate ) {

   

        $newItem = $mylist.Items.Add()

 

        $newItem["День рождения"] = $userBirthDayNormal

        $newItem["Именинник"] = $userValue

        $newItem.Update()

    }

}

 

 

 

 

 

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: