Наверное, ни для кого не секрет, что в SP 2016 убрали FIM
и на его основе сделали MIM.
Но как быть если хочется погружать свойства из AD в свойства
пользователей и при этом не ставить MIM.
В этой статье я расскажу, как можно с помощью PowerShell загрузить фото.
Принцип работы такой:
- Из AD получаем всех пользователей, у которых есть фото.
- Далее пробегаем по ним и сохраняем файлы фотографий локально на диск сервера.
- Следующим этапом циклом проходим по файлам на диске и загружаем их SP
так же обновлять доп свойства которые не импортируются по умолчанию.
Скрипт можно сохранить в файл и запускать по через задания 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
Комментариев нет:
Отправить комментарий