В этой статье я расскажу, как решал задачу по заполнению филиала обратившегося сотрудника беря данные из UPS.
В общем стандартная ситуация, идет проект уже полгода, и тут понимают, что для получения более полной статистики по обращениям не хватает еще понимания филиала сотрудника. Эта информация есть в AD и в UPS в свойстве SPS-Location.
Для заполнения этой информации в новых заявках я это реализовал средствами js (постараюсь описать решение в блоге), но вот в уже существующих заявках решил прибегнуть к PowerShell
Алгоритм следующий
1. Получаем контекст службы UPS
2. Получаем все элементы списка у которых не заполнено свойство Филиал
3. По id инициатора узнаем его email в списке Список сведений о пользователях
4. Получаем у службы UPS в свойстве SPS-Location через Email пользователя
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | # Контекст службы User Profiles Services $site = Get -SPSite $mySiteUrl $context = Get -SPServiceContext $site $profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager( $context ) # обращаетмся к списку Заявки и получаем все элементы у которых не заполнено поле $list = $web .Lists[ 'Заявки' ] $listId = $list .ID; $query = New-Object Microsoft.SharePoint.SPQuery; $camlQuery = "<where><eq><fieldref name=" Branch "><value type=" Text "></value></fieldref></eq></where>" ; $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 = "<where><eq><fieldref name=" ID "><value type=" Counter ">$userId</value></fieldref></eq></where>" ; $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 ) |
Комментариев нет:
Отправить комментарий