вторник, 16 декабря 2014 г.

Экспорт дня рождения из BDC в User Profile с помощью PowerShell

Некоторое время назад встала задача экспортировать дни рождения сотрудников из внешней базы в SharePoint. есть некоторые нюансы, связать между собой базу и пользователя можно только по E-mail.
Решил попробовать стандартным способом через ЦА, но ничего не вышло.
Тогда я решил менять настройки с помощью miisclient.exe, но результата не дало. Ошибок как таковых не возникало, но и данные не затягивались.

мне надоело плясать с бубном и я решил прибегнуть к знакомому PowerShell




первым делом подключаемся службе User Profile
далее подключаемся к внешнему списку и получаем оттуда данные.
и вот тут начинается самое интересное.

как выяснилось, получить данные пользователя по E-mail и сразу внести  дату рождения не получится. Так что вначале нам нужно найти профиль по e-mail с помощью .Search(). действие аналогично кнопке
далее можно взять свойство RecordId и уже по нему получить данные с помощью функции  GetProfile(RecordId).
Как работает скрипт, циклом пробегает по всему внешнему списку, берет данные из поля e-mail, и по e-mail ищет пользователя, если пользователь есть, то обновляем его день рождения.


$mySiteUrl = "http://my.site" #адрес веб приложения на котором находятся личные сайты

#Connect to User Profile Manager service 
$site = Get-SPSite $mySiteUrl 
$context = Get-SPServiceContext $site 
$profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context) 

#Connect to External Content Type
$ctx = Get-SPServiceContext http://site
$scope = new-object Microsoft.SharePoint.SPServiceContextScope $ctx

$web = Get-SPWeb http://site #сайт в котором находится внешний список
$list = $web.Lists['Employees'] # внешний список

$items = $list.GetItems()

foreach ($item in $items) #пробегаем по всем элементам внешнего списка
{
   write-host $item['FullName']  / $item['BirthDate'] / $item['Email'] # здесь я вывожу поля которые есть у меня во внешнем списке, у Вас могут быть другие.
    $user = $profileManager.Search($item['Email'])
    $userId = $user.RecordId 
    if ($userId -ne $null) # проверяем что есть нашелся пользователь с таким e-mail
    {
    $up =  $profileManager.GetProfile($userId)
    $up['SPS-Birthday'].Value = $item['BirthDate']
    $up.Commit()
    }

}
$web.Dispose()