среда, 2 ноября 2016 г.

Заполнение филиала сотрудника из свойств пользователей с помощью PowerShell

В этой статье я расскажу, как решал задачу по заполнению филиала обратившегося сотрудника беря данные из 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 = "$userId";
   $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)