Microsoft, uygulamalarında ( Exchange, SharePoint vb.) kullanıcılara AD veya AAD üzerinde bulunan kullanıcı fotoğraflarını kullanılmasına izin vermektedir.
Eklemiş olduğunuz fotoğraflar kullanıcıya ait Attributes üzerinde saklanmaktadır. (ThumbnailPhoto) Biz bu işlemi kullanırken Logon PS kullanacağız, kullanıcı Windows üzerinden her oturum açtığında AD üzerinde bulunan ThumbnailPhoto değerini okuyacak ve profil resmini gösterecek.
Makale İçeriği
- Kullanılması Gereken Fotoğraf Özellikleri ve Kullanıcıya Fotoğraf Ekleme
- Active Directory Kullanıcılara Toplu Fotoğraf Yapılandırması
- Active Directory Kullanıcı Resimleri için GPO Dağıtımı
Kullanılması Gereken Fotoğraf Özellikleri ve Kullanıcıya Fotoğraf Ekleme
- Kullanmış olduğunuz fotoğraflar JPEG/BMP formatında olması gerekmektedir.
- Resim boyutu 100KB’yi geçmemesi gerekmektedir.
- Resim Çözünürlüğü 96×96 piksel olması gerekmektedir.
Ben kullanıcıma fotoğraf atamasını yapmadan önce ADUC üzerinden Attribute Editor üzerinden “thumbnailPhoto” değerini kontrol ediyorum.
Eğer ortamınızda thumbnailPhoto değeri boş olan kullanıcıları listelemek isterseniz, aşağıdaki scripti kullanabilirsiniz.
Get-ADUser -Filter * -properties thumbnailPhoto | ? {(-not($_.thumbnailPhoto))} | select Name
Öncelikle AD üzerinde bulunan kullanıcımıza aşağıda belirtmiş olduğum Script ile fotoğraf ekliyoruz.
$photo = [byte[]](Get-Content C:\Photo\cozumpark.jpg -Encoding byte)
Set-ADUser cozumpark -Replace @{thumbnailPhoto=$photo}
cozumpark kullanıcısının thumbnailPhoto değerinin atandığını görebiliyoruz.
Active Directory Kullanıcılara Toplu Fotoğraf Yapılandırması
Kullanıcıların fotoğraf yapılandırmasını toplu olarak yapmak isterseniz, bir CSV dosyası oluşturabilirsiniz. CSV dosyası aşağıdaki gibi hazırlanması gerekmektedir.
AD_user , path_to_file
User,C:\Photos\user.jpg
User2, C:\Photos\user2.jpg
User3, C:\Photos\user3.jpg
İlgili CSV dosyasını ile beraber aşağıdaki Scripti çalıştırabilirsiniz.
Import-Csv C:\Photos\photos.csv |%{Set-ADUser -Identity $_.AD_user -Replace @{thumbnailPhoto=([byte[]](Get-Content $_.path_to_file -Encoding byte))}}
Active Directory Kullanıcı Resimleri için GPO Dağıtımı
Kullanıcılara hesap değiştirme izni vermemiz gerekmektedir, bu izni GPO kullanarak Registry hazırlayarak yapacağız. Öncelikle GPO ayarlarımız oluşturacağımız yeni bir GPO oluşturmamız gerekmektedir. Oluşturmuş olduğunuz GPO’yu ilgili OU içerisine link etmeniz gerekmektedir.
Yapılandırma için oluşturmuş olduğumuz GPO’yu EDIT ediyoruz ve Computer Configuration olarak yapılandırıyoruz. Takip etmemiz gereken yol aşağıdaki gibidir.
Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Registry
Add Key ile devam ediyoruz.
Select Registry Key adımından aşağıdaki yolu takip ediyoruz;
MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users;
Database Security ekranında “DOMAIN\Users” bölümüne FullControl yetkisi vermemiz gerekmektedir.
İlgili pencereyi onayladıktan sonra, Add Object penceresi sizi karşılamaktadır. Burada “Replace existing permissions on all subkeys with inheritable permissions” (Alt anahtarlarıdaki mevcut izni devrealınabilen izinlerle değiştir” seçeneği seçiyoruz.
Oluşturmuş olduğumuz GPO’yu düzenlemeye devam ediyoruz. Computer Configuration -> Administrative Templates -> System -> Group Policy adımlarını takip ediyoruz ve Configure user Group Policy Loopback Processing mode seçeneğini etkinleştirdikten sonra Mode bölümünü Merge olarak değiştiriyoruz.
Kullanıcının thumbnailPhoto değerini AD üzerinden okuyacak ve JPG dosyası olarak kaydedilmesi gerekmektedir. Bu işlemi PS Script ile yapabilmekteyiz.
Script olmadan bu işlemi yapmak isterseniz tüm ortamınıza RSAT modulünü yüklemeniz gerekebilir, bu ortamınız için güvenilir olmadığı için ve Script RSAT modülü gerektirmediği için bu işlemimiz Script ile yapacağız.
İlgili Scripti NETLOGON içerisinde çalıştırabilirsiniz.
Bu script kullanıcının AD üzerinde resmini Local’de bulunan Pictures klasörüne kaydetmektedir.
Function ResizeImage {
Param (
[Parameter(Mandatory = $True, HelpMessage = "image in byte")]
[ValidateNotNull()]
$imageSource,
[Parameter(Mandatory = $true, HelpMessage = "Betwwen 16 and 1000")]
[ValidateRange(16, 1000)]
$canvasSize,
[Parameter(Mandatory = $true, HelpMessage = "Between 1 and 100")]
[ValidateRange(1, 100)]
$ImgQuality = 100
)
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
$imageBytes = [byte[]]$imageSource
$ms = New-Object IO.MemoryStream($imageBytes, 0, $imageBytes.Length)
$ms.Write($imageBytes, 0, $imageBytes.Length);
$bmp = [System.Drawing.Image]::FromStream($ms, $true)
# Image size after conversion
$canvasWidth = $canvasSize
$canvasHeight = $canvasSize
# Set picture quality
$myEncoder = [System.Drawing.Imaging.Encoder]::Quality
$encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1)
$encoderParams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter($myEncoder, $ImgQuality)
# Get image type
$myImageCodecInfo = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | Where-Object { $_.MimeType -eq 'image/jpeg' }
# Get aspect ration
$ratioX = $canvasWidth / $bmp.Width;
$ratioY = $canvasHeight / $bmp.Height;
$ratio = $ratioY
if ($ratioX -le $ratioY) {
$ratio = $ratioX
}
# Create an empty picture
$newWidth = [int] ($bmp.Width * $ratio)
$newHeight = [int] ($bmp.Height * $ratio)
$bmpResized = New-Object System.Drawing.Bitmap($newWidth, $newHeight)
$graph = [System.Drawing.Graphics]::FromImage($bmpResized)
$graph.Clear([System.Drawing.Color]::White)
$graph.DrawImage($bmp, 0, 0 , $newWidth, $newHeight)
# Create an empty stream
$ms = New-Object IO.MemoryStream
$bmpResized.Save($ms, $myImageCodecInfo, $($encoderParams))
# cleanup
$bmpResized.Dispose()
$bmp.Dispose()
return $ms.ToArray()
}
$ADUserInfo = ([ADSISearcher]"(&(objectCategory=User)(SAMAccountName=$env:username))").FindOne().Properties
$ADUserInfo_sid = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
If ($ADUserInfo.thumbnailphoto) {
$img_sizes = @(32, 40, 48, 96, 192, 200, 240, 448)
$img_base = "C:\Users\Public\AccountPictures"
$reg_key = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users\$ADUserInfo_sid"
If ((Test-Path -Path $reg_key) -eq $false) { New-Item -Path $reg_key } { write-verbose "Reg key exist [$reg_key]" }
Try {
ForEach ($size in $img_sizes) {
$dir = $img_base + "\" + $ADUserInfo_sid
If ((Test-Path -Path $dir) -eq $false) { $(New-Item -ItemType directory -Path $dir).Attributes = "Hidden" }
$file_name = "Image$($size).jpg"
$path = $dir + "\" + $file_name
Write-Verbose " Crete file: [$file_name]"
try {
ResizeImage -imageSource $($ADUserInfo.thumbnailphoto) -canvasSize $size -ImgQuality 100 | Set-Content -Path $path -Encoding Byte -Force -ErrorAction Stop
Write-Verbose " File saved: [$file_name]"
}
catch {
If (Test-Path -Path $path) {
Write-Warning "File exist [$path]"
}
else {
Write-Warning "File not exist [$path]"
}
}
$name = "Image$size"
try {
$null = New-ItemProperty -Path $reg_key -Name $name -Value $path -Force -ErrorAction Stop
}
catch {
Write-Warning "Reg key edit error [$reg_key] [$name]"
}
}
}
Catch {
Write-Error "Check permissions to files or registry."
}
}
İlgili scripti paylaşıma açılmış bir klasöre kopyalamanız yeterlidir.
Oluşturmuş olduğumu Script üzerinde düzenleme işlemine devam ediyoruz, User Configuration>Windows Settings>Scripts – LogOn adımlarını takip ediyoruz.
Bu işlemi yaptıktan sonra oturumu kapatıp tekrar açmanız gerekmektedir. Bu işlemi 2 kere yapmanız gerekmektedir. Login ekranımda kullanıcım için yüklemiş olduğum resim gözükmektedir.
Kullanıcıların resimleri oluşturduktan sonra Regedit üzerinden resim ve kullanıcı profili ile ilgili eşleşmeleri kontrol edebilirsiniz.