Наверное, ни для кого не секрет, что в 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
Комментариев нет:
Отправить комментарий