Для AD thumbnailPhoto
максимальный размер составляет 96x96 пикселей, поэтому я обычно использую такие функции, чтобы исходное изображение вписывалось в этот маленький квадрат.Вместо того, чтобы использовать функцию, которая требует от вас указывать процент, проще просто использовать эти макс.размеры.
Это вспомогательная функция, которая изменяет размер исходного изображения:
function Shrink-Image {
# helper function to resize an image so it fits inside the given "TargetSize"
# It returns the path and filename of the resized image or the path to the original image if
# that happened to fit inside the "TargetSize" square.
[CmdletBinding()]
param (
[Parameter(Mandatory=$true, Position=0)]
[Alias("FileName")]
[ValidateScript({Test-Path $_ -PathType Leaf})]
[string]$ImagePath,
[Parameter(Mandatory=$true, Position=1)]
[int]$TargetSize,
[int]$Quality = 90
)
Add-Type -AssemblyName "System.Drawing"
$img = [System.Drawing.Image]::FromFile($ImagePath)
# if the original image fits inside the target size, we're done
if ($img.Width -le $TargetSize -and $img.Height -le $TargetSize) {
$img.Dispose()
return $ImagePath
}
# set the encoder quality
$ImageEncoder = [System.Drawing.Imaging.Encoder]::Quality
$encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1)
$encoderParams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter($ImageEncoder, $Quality)
# set the output codec to jpg
$Codec = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | Where-Object {$_.MimeType -eq 'image/jpeg'}
# calculate the image ratio
$ratioX = [double]($TargetSize / $img.Width)
$ratioY = [double]($TargetSize / $img.Height)
if ($ratioX -le $ratioY) { $ratio = $ratioX } else { $ratio = $ratioY }
$newWidth = [int]($img.Width * $ratio)
$newHeight = [int]($img.Height * $ratio)
$newImage = New-Object System.Drawing.Bitmap($newWidth, $newHeight)
$graph = [System.Drawing.Graphics]::FromImage($newImage)
$graph.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
$graph.Clear([System.Drawing.Color]::White)
$graph.DrawImage($img, 0, 0, $newWidth, $newHeight)
# save the new image as temp file
$OutputPath = [System.IO.Path]::GetTempFileName()
# For safety: a [System.Drawing.Bitmap] does not have a "overwrite if exists" option for the Save() method
if (Test-Path $OutputPath) { Remove-Item $OutputPath -Force }
$newImage.Save($OutputPath, $Codec, $($encoderParams))
$graph.Dispose()
$newImage.Dispose()
$img.Dispose()
return $OutputPath
}
При необходимости изменяет размеры до указанного $TargetSize
и возвращает полный путь и имя файла для этого изображения с измененным размером.(Примечание: возвращаемый путь также может совпадать с исходным изображением, если он вписывается в квадрат $TargetSize
)
Следующая функция фактически устанавливает изображение в свойстве AD thumbnailPhoto
объектаuser:
function Set-ADUserPicture {
[CmdletBinding(DefaultParameterSetName = 'ByName')]
param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'ByName', Position = 0)]
[String]$Identity, # This can be: Distinguished Name, objectGUID, objectSid, sAMAccountName
[Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'ByObject', Position = 0)]
[Object]$User, # This is the user object from Get-ADUser
[Parameter(Mandatory = $true, Position = 1)]
[String]$ImageFile
)
if ($PSCmdlet.ParameterSetName -eq 'ByName') {
$User = Get-ADUser -Identity $Identity
}
if ($User) {
Write-Verbose ("Inserting userpicture in Active Directory for user {0}" -f $User.Name)
try {
# create a thumbnail using the original image, and size it down to 96x96 pixels
$pictureFile = Shrink-Image -ImagePath $ImageFile -TargetSize 96
[byte[]]$pictureData = [System.IO.File]::ReadAllBytes($pictureFile)
$User | Set-ADUser -Replace @{thumbnailPhoto = $pictureData } -ErrorAction Stop
}
catch {
Write-Error "Set-ADUserPicture: $($_.Exception.Message)"
}
finally {
if ($pictureFile -ne $ImageFile) {
# the original image was larger than 96x96 pixels, so we created a temp file. Remove that.
Remove-Item $pictureFile -Force -ErrorAction SilentlyContinue
}
}
}
}
Вы называете это с помощью Identity, например Set-ADUserPicture -Identity $SamAccountName -ImageFile $UserImagePath
, или с помощью объекта пользователя, который вы получили ранее, используя Get-ADUser
командлет, такой как $userObject | Set-ADUserPicture -ImageFile $UserImagePath
Если вы хотитесделать что-то похожее на картинку профиля Office365, то макс.Размеры составляют 648х648 пикселей.Для этого вам необходимо сначала войти в систему, используя что-то вроде этого:
$Cred = Get-Credential -UserName "admin@yourdomain.com" -Message "Please enter admin credentials for Office365"
$Url = "https://outlook.office365.com/powershell-liveid/?proxyMethod=RPS"
$Session = New-PSSession -ConfigurationName "Microsoft.Exchange" -ConnectionUri $Url -Credential $Cred -Authentication Basic -AllowRedirection
Import-PSSession $Session -DisableNameChecking -AllowClobber -WarningAction SilentlyContinue -ErrorAction SilentlyContinue | Out-Null
После этого следующая функция установит это изображение аналогично функции для AD thumbnailPhoto
:
function Set-O365UserPicture {
[CmdletBinding(DefaultParameterSetName = 'ByName')]
param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'ByName', Position = 0)]
[String]$Identity, # This can be: Distinguished Name, objectGUID, objectSid, sAMAccountName
[Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'ByObject', Position = 0)]
[Object]$User, # This is the user object from Get-ADUser
[Parameter(Mandatory = $true, Position = 1)]
[String]$ImageFile
)
if ($PSCmdlet.ParameterSetName -eq 'ByName') {
$User = Get-ADUser -Identity $Identity
}
if ($User) {
Write-Verbose ("Inserting userpicture in Office365 for user {0}" -f $User.Name)
try {
# shrink the original image, and size it down to 648x648 pixels
$pictureFile = Shrink-Image -ImagePath $ImageFile -TargetSize 648
[byte[]]$pictureData = [System.IO.File]::ReadAllBytes($pictureFile)
$User | Set-UserPhoto -PictureData $pictureData -Confirm:$false -ErrorAction Stop
}
catch {
Write-Error "Set-O365UserPicture: $($_.Exception.Message)"
}
finally {
if ($pictureFile -ne $ImageFile) {
# the original image was larger than 648x648, so we created a temp file. Remove that.
Remove-Item $pictureFile -Force -ErrorAction SilentlyContinue
}
}
}
}
Вы вызываете его с помощью идентификатора, например Set-O365UserPicture -Identity $SamAccountName -ImageFile $UserImagePath
, или с помощью пользовательского объекта, который вы получили ранее, с помощью командлета Get-ADUser
, например $userObject | Set-O365UserPicture -ImageFile $UserImagePath
Для обеих функций Set-ADUserPicture
и Set-O365UserPicture
Желательно также добавить переключатель -Verbose
.