Показаны сообщения с ярлыком User profile. Показать все сообщения
Показаны сообщения с ярлыком User profile. Показать все сообщения

вторник, 31 мая 2016 г.

SharePoint. Вывод всех полей UPSA используя Powershell

Ниже представлен небольшой скрипт для вывода основных полей из User Profile Service Application. Помимо тривиального перебора свойств Microsoft.Office.Server.UserProfiles.UserProfileManager, стоит отметить наличие столбца, в котором указано привязанное поле в Active Directory и направление синхронизации. Так же есть небольшая особенность вывода значений в файл.

# Почистить вывод
cls
# Получить оснастку
Add-PSSnapin "Microsoft.SharePoint.PowerShell"
# Указываем имя подключения (имя можно посмотреть по адресу:http://CA:port/_layouts/15/mgrdsserver.aspx?ApplicationID={GUID})
$connectionName = "MyConnectionName"
# Адрес коллекции
$siteUrl = "http://server:port"
# Получаем коллекцию
$site = Get-SPSite $mySiteUrl
# Получаем SPServiceContext
$context = Get-SPServiceContext $site
# Получаем все необходимые объекты
$profileConfigManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileConfigManager($context)
$syncConnection = $profileConfigManager.ConnectionManager[$connectionName]
$profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
$propertyList = New-Object System.Collections.Generic.List[System.Object]
# Формируем список
foreach ($p in $profileManager.properties) 
{    
    $propertyObject = New-Object PSObject
    # Системное имя
    $propertyObject | Add-Member Name $p.Name
    # Отображаемое имя
    $propertyObject | Add-Member DisplayName $p.DisplayName
    # Переводы на интересующие языки (Ru)
    $propertyObject | Add-Member LocalRU $p.DisplayNameLocalized[1049]
    # Переводы на интересующие языки (En)
    $propertyObject | Add-Member LocalEN $p.DisplayNameLocalized[1033]
    # Тип  
    $propertyObject | Add-Member Type $p.Type
    # Размер поля
    $propertyObject | Add-Member Length $p.Length
    # Синхронизируемое поле в АД
    $pm = $syncConnection.PropertyMapping[$p.Name]
    $propertyObject | Add-Member PropertyNameAD $pm.DataSourcePropertyName
    # Направление синхронизации   
    $propertyObject | Add-Member IsImportFromAD $pm.IsImport 
    # Обязательность
    $propertyObject | Add-Member IsRequired $p.IsRequired
    # Параметр конфиденциальности 
    $propertyObject | Add-Member DefaultPrivacy $p.DefaultPrivacy
    # Возможность переопределения конфиденциальности
    $propertyObject | Add-Member UserOverridePrivacy $p.UserOverridePrivacy
    # Возможность изменения пользователем
    $propertyObject | Add-Member IsUserEditable $p.IsUserEditable
    # Отображение на странице просмотра
    $propertyObject | Add-Member IsVisibleOnViewer $p.IsVisibleOnViewer
    # Отображение на форме изменения
    $propertyObject | Add-Member IsVisibleOnEditor $p.IsVisibleOnEditor
    # Индексация (в смысле доступен для поиска)
    $propertyObject | Add-Member IsSearchable $p.IsSearchable
    # Добавить в список
    $propertyList.Add($propertyObject)   
}
# Выводим список на экран в отдельном окне в сетке
$propertyList | Out-GridView
# Выводим список в текстовый файл с заголовками 
$propertyList | Format-Table -Property * -AutoSize ` | Out-String -Width 4096 ` | Out-File C:\FileName.txt

Имя соединения можно посмотреть в настройках UPSA, там может быть несколько соединений.



Обратите внимание на кусочек вывода в файл. Необходимо указывать "Out-String" чтобы строки не обрезались.

вторник, 2 декабря 2014 г.

SharePoint. System.ArgumentException: calType

В процессе использования SharePoint 2013 коллега поправил себе профиль, добавив дополнительные языки:


Установлен Service Pack 1, а English Language Pack - нет.
Сразу же после применения изменений на всех страницах появлялась ошибка:

Пробовал через PowerShell скопировать поля из работающего профиля в сломанный, это не дало результат.
Исправить удалось удалением профиля, используя PowerShell:
if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null) 
{
    Addd-PSSnapin "Microsoft.SharePoint.PowerShell"
}
[void][reflection.assembly]::Loadwithpartialname("Microsoft.Office.Server");     
$site=new-object Microsoft.SharePoint.SPSite("http://portal");            
$serviceContext = Get-SPServiceContext $site;            
$site.Dispose();            
$upm = new-object Microsoft.Office.Server.UserProfiles.UserProfileManager($serviceContext);
$upm.RemoveUserProfile("Domain\Account");
Хотя это можно сделать через веб-интерфейс.
Потом на всякий случай удалил пользователя из user information list, для этого я использовал SharePoint End User Viewer Tool, таким образом проблема была решена.

Но ошибка может сохраняться, если пользователь присутствует на других коллекциях.
Это происходит из-за того, что каждая коллекция сайтов имеет свой список сведений о пользователях. Коллекций может быть очень много. Например, из-за личных сайтов.
Чтобы автоматически удалить из всех коллекций - воспользуйтесь скриптом ниже:
Add-PSSnapin Microsoft.SharePoint.PowerShell
$UserLogin = "i:0#.w|domain\login";
$Sites = Get-SPSite -Limit All
$AllSites = @()

foreach($Site in $Sites)
{
    $RootWeb = $Site.RootWeb
    If([bool](Get-SPUser -Identity $UserLogin -Web $RootWeb -EA SilentlyContinue) -eq $True)
    {
        $User = Get-SPUser -Identity $UserLogin -Web $RootWeb
        Write-Host ("Удален из " + $RootWeb.Url)
        Remove-SPUser -Identity $User -Web $RootWeb -Confirm:$False
        $AllSites += $RootWeb.Url
    }
    else
    {
        Write("Отсутствует на: " + $RootWeb.Url)
    }
}

if(!($AllSites).count -eq 0)
{
    Write-Host "Removed user $($UserLogin) from:" -Fore "Magenta"
    foreach($S in $AllSites){Write-Host “- $S”}
    Write-Host ""
    $AllSites = @()
}