вторник, 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 = @()
}