Некоторое время назад встала задача экспортировать дни рождения сотрудников из внешней базы в SharePoint. есть некоторые нюансы, связать между собой базу и пользователя можно только по E-mail.
Решил попробовать стандартным способом через ЦА, но ничего не вышло.
Тогда я решил менять настройки с помощью miisclient.exe, но результата не дало. Ошибок как таковых не возникало, но и данные не затягивались.
мне надоело плясать с бубном и я решил прибегнуть к знакомому PowerShell
первым делом подключаемся службе User Profile
далее подключаемся к внешнему списку и получаем оттуда данные.
и вот тут начинается самое интересное.
как выяснилось, получить данные пользователя по E-mail и сразу внести дату рождения не получится. Так что вначале нам нужно найти профиль по e-mail с помощью .Search(). действие аналогично кнопке
далее можно взять свойство RecordId и уже по нему получить данные с помощью функции GetProfile(RecordId).
Как работает скрипт, циклом пробегает по всему внешнему списку, берет данные из поля e-mail, и по e-mail ищет пользователя, если пользователь есть, то обновляем его день рождения.
первым делом подключаемся службе 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()

Комментариев нет:
Отправить комментарий