понедельник, 21 мая 2018 г.

Обновление фотографий пользователей из AD (SharePoint 2016)

Наверное, ни для кого не секрет, что в SP 2016 убрали FIM и на его основе сделали MIM. Но как быть если хочется погружать свойства из AD в свойства пользователей и при этом не ставить MIM.
В этой статье я расскажу, как можно с помощью PowerShell загрузить фото.
Принцип работы такой:
  • Из AD получаем всех пользователей, у которых есть фото.
  • Далее пробегаем по ним и сохраняем файлы фотографий локально на диск сервера.
  • Следующим этапом циклом проходим по файлам на диске и загружаем их SP
Скрипт позволяет удалять не синхронизированных пользователей (удаленных из AD).
так же обновлять доп свойства которые не импортируются по умолчанию.
Скрипт можно сохранить в файл и запускать по через задания Windows, при этом будут создаваться записи в EventViewer.


для использования необходимо поменять значения переменных
$MySiteUrl = "https://my.company.ru"
$LocalPath = "C:\temp\folder"
$domain = "My-CORP\"
$domainOU = "DC=my-corp,DC=local"

if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
 Add-PSSnapin Microsoft.SharePoint.PowerShell;
}
function Upload-PhotosToSP
{
    Param (
           [parameter(Mandatory=$true)][string]$LocalPath, 
           [parameter(Mandatory=$true)][string]$MySiteUrl, 
           [parameter(Mandatory=$true)][string]$Domain, 
           [parameter(Mandatory=$false)][switch]$Overwrite
           )

    
    $mySiteHostSite = Get-SPSite $MySiteUrl
    $mySiteHostWeb = $mySiteHostSite.OpenWeb()
    $context = Get-SPServiceContext $mySiteHostSite
    $profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
    try
    {   
        #Get files from local folder
        $localPhotosFolder = Get-ChildItem $LocalPath
        #Get User Photos document library in the My Site host site
        $spPhotosFolder = $mySiteHostWeb.GetFolder("User Photos")
        
        #Upload each image file and configure user profiles
        $localPhotosFolder | ForEach-Object {
  
            #Generate file path for upload into SharePoint
            $spFullPath = $spPhotosFolder.Url + "/" + $_.Name
                
            #Check if the file exists and the overwrite option is selected before adding the file
            if ((!$mySiteHostWeb.GetFile($spFullPath).Exists) -or ($Overwrite)) {
                #Add file to the User Photos library
                $spFile = $spPhotosFolder.Files.Add($spFullPath, $_.OpenRead(), $true)
                $spImagePath = $mySiteHostWeb.Url + "/" + $spFile.Url
                


                #Get the domain and user name from the image file name
                $adAccount = $_.Name -replace ".jpg", ""; 
               
                $adAccountFull = "$Domain$adAccount"
                
                $users =  $profileManager.Search($adAccount)
                foreach($user in $users){
                    if($user.ProfileType -eq "User"){

                    $userId = $user.RecordId 
                        if ($userId -ne $null)
                        {
                            $up = $profileManager.GetUserProfile($userId)                          
                            $up.AccountName 
                            
                            #Get user profile and change the Picture URL value
                            if($up.AccountName -eq $adAccountFull){
                                 Write-host $up.AccountName -ForegroundColor Blue
                                
                                $up["PictureURL"].Value = $spImagePath
                                $up.Commit()
                            }else{
        Write-host "логин не соответствует - " $adAccountFull -ForegroundColor Red
       }
                        }
                        else
                        {
                            write-host "Profile for user"$adAccount "cannot be found"
                        }
                    }
                }

            }
            else
            {
                write-host "`nFile"$_.Name "already exists in" $spFullPath.Replace("/" + $_.Name,"") "and shall not be uploaded" -foregroundcolor Red
            }
        }
        
        #Run the Update-SPProfilePhotoStore cmdlet to create image thumbnails and update user profiles
        write-host "Waiting to update profile photo store - Please wait..."
        Start-Sleep -s 60
        Update-SPProfilePhotoStore –MySiteHostLocation $MySiteUrl
        write-host "Profile photo store update run - please check thumbnails are present in Profile Pictures folder."
    }
    catch
    { 
        write-host "The script has stopped because there has been an error: "$_
    }
    finally
    {
        #Dispose of site and web objects
        $mySiteHostWeb.Dispose()
        $mySiteHostSite.Dispose()
    }
}

$MySiteUrl = "https://my.company.ru" 
$LocalPath = "C:\temp\folder"
$domain = "My-CORP\"
$domainOU = "DC=my-corp,DC=local"


cls

#Старт полной синхронизации
$upa = Get-SPServiceApplication | where {$_.TypeName -eq "User Profile Service Application"}
$upa.StartImport($true)



Import-Module ActiveDirectory  
$users = Get-ADUser -Filter * -SearchBase $domainOU -Properties thumbnailPhoto | ? {$_.thumbnailPhoto} #| select Name 
$count = 0
foreach ($user in $users) {
    $count = $count + 1
    Write-Progress -Activity "Загрузка фотографий из AD " -status "текущий элемент № $count" -percentComplete ($count /  $users.Count * 100)
    $user.SamAccountName
    $name = $user.SamAccountName + ".jpg"  
    $user.jpegPhoto | Set-Content ("$LocalPath\$($User.SamAccountName).jpg") -Encoding byte
}
start-sleep 3
write-progress one one -completed
Write-Host "фото загружены на диск сервера."

Upload-PhotosToSP -LocalPath $LocalPath  -MySiteUrl $MySiteUrl -Domain $domain -Overwrite

Write-Host "Удаление не синхронизированных пользователей." -ForegroundColor Green
Set-SPProfileServiceApplication -Identity $upa -PurgeNonImportedObjects $true
#Set-SPProfileServiceApplication -Identity $upa -GetNonImportedObjects $true


Write-Host "Обновление свойств пользователя."
$context = Get-SPServiceContext($MySiteUrl)
$profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
$users =  $profileManager.GetEnumerator()
$count = 0
foreach($user in $users){
    $userLogin = ($user.AccountName).Replace($domain,"")
    $count = $count + 1
    Write-Progress -Activity "Обновление свойств пользователя " -status "текущий пользователь № $count" -percentComplete ($count /  $profileManager.Count * 100)
     
    $userAD = Get-ADUser -Identity  $userLogin  -Properties "Company"
    if($userAD.Company -ne $null -and $userAD.Company -ne "" ){
       # Write-Host $user.DisplayName //  $userAD.Company -ForegroundColor Green
        $user["Company"].Value = $userAD.Company
        $user.Commit()
          
    }     
}



New-EventLog –LogName Application –Source "SST-SharePoint"
Write-EventLog -LogName "Application" -Source "SST-SharePoint" -EventID 11111 -EntryType Information -Message "Фото обновлены" -Category "Update User Photo" 

     
   
за основу был взят скрипт Bulk Upload and Update User Profile Photos in SharePoint 2013

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

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