В этой статье я расскажу, как решал задачу по заполнению филиала обратившегося сотрудника беря данные из UPS.
В общем стандартная ситуация, идет проект уже полгода, и тут понимают, что для получения более полной статистики по обращениям не хватает еще понимания филиала сотрудника. Эта информация есть в AD и в UPS в свойстве SPS-Location.
Для заполнения этой информации в новых заявках я это реализовал средствами js (постараюсь описать решение в блоге), но вот в уже существующих заявках решил прибегнуть к PowerShell
Алгоритм следующий
1. Получаем контекст службы UPS
2. Получаем все элементы списка у которых не заполнено свойство Филиал
3. По id инициатора узнаем его email в списке Список сведений о пользователях
4. Получаем у службы UPS в свойстве SPS-Location через Email пользователя
# Контекст службы User Profiles Services $mySiteUrl = "http://my.site.ru/" $site = Get-SPSite $mySiteUrl $context = Get-SPServiceContext $site $profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context) # обращаетмся к списку Заявки и получаем все элементы у которых не заполнено поле $web = Get-SPWeb http://sites/site $list = $web.Lists['Заявки'] $listId = $list.ID; $query = New-Object Microsoft.SharePoint.SPQuery; $camlQuery = ""; $query.Query = $camlQuery; $query.ViewAttributes = "Scope='Recursive'"; $query.RowLimit = 5; do { $listItems = $list.GetItems($query) $query.ListItemCollectionPosition = $listItems.ListItemCollectionPosition foreach ($item in $listItems) { if($item -ne $null) { # делаем запрос к списку сведений о пользователе для получения Email $Userlist = $web.Lists['Список сведений о пользователях'] $userId = $item['InternalInitiator'].Substring(0,$item['InternalInitiator'].IndexOf(";")) $queryUser = New-Object Microsoft.SharePoint.SPQuery; $camlQueryUser = " "; $queryUser.Query = $camlQueryUser; $queryUser.ViewAttributes = "Scope='Recursive'"; $queryUser.RowLimit = 5; $UserlistItems = $Userlist.GetItems($queryUser) $queryUser.ListItemCollectionPosition = $UserlistItems.ListItemCollectionPosition foreach ($UserItem in $UserlistItems) { $UserItem['EMail'] # ищем пользователя в службе UPS по емай $user = $profileManager.Search($UserItem['EMail']) # получаем его уникальный ID $userId = $user.RecordId if ($userId -ne $null) { # заполняем поле в списке Заявки $up = $profileManager.GetProfile($userId) $branch = $up['SPS-Location'] $item['Branch'] = $branch $item.Update() } } } } } while ($query.ListItemCollectionPosition -ne $null) $userId
Комментариев нет:
Отправить комментарий