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

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

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

Комментариев нет:

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