Microsoft, Exchange ve SharePoint gibi birçok uygulamasında kullanıcıların Active Directory (AD) ya da Azure Active Directory (AAD) (Entra ID) üzerinde yer alan profil fotoğraflarını kullanmasına olanak tanımaktadır. Bu fotoğraflar genellikle thumbnailPhoto
attribute’u içerisinde saklanır.
Bu makalede, kullanıcı profil fotoğraflarını Active Directory’ye ekleme, toplu yapılandırma ve GPO aracılığıyla istemcilere dağıtma işlemlerini adım adım ele alacağız. 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.
İçindekiler
Active Directory Kullanıcısına Fotoğraf Ekleme
Active Directory Kullanıcı Fotoğrafı Ekleme Gereksinimleri
- Format: JPEG veya BMP
- Boyut: Maksimum 100KB
- Çözünürlük: 96×96 piksel
Fotoğrafı yüklemeden önce, kullanıcıya ait thumbnailPhoto
değeri ADUC > Attribute Editor üzerinden kontrol edilmelidir.

Active Directory ThumbnailPhoto Değeri Boş Kullanıcıları Görüntüleme
Eğer Active Directory ortamınızda thumbnailPhoto değeri boş olan kullanıcıları listelemek isterseniz, aşağıdaki scripti kullanabilirsiniz.
Get-ADUser -Filter * -Properties thumbnailPhoto | Where-Object { -not $_.thumbnailPhoto } | Select-Object Name

Active Directory Tekil Kullanıcıya Fotoğraf Ekleme
Active Directory ortamımızda bulunan tek bir kullanıcıya fotoğraf atamak isterseniz, aşağıdaki PowerShell scripti kullanabilirisiniz.
$photo = [byte[]](Get-Content C:\Photo\cozumpark.jpg -Encoding byte)
Set-ADUser cozumpark -Replace @{thumbnailPhoto=$photo}

Bu işlemden sonra ADUC üzerinden objeyi kontrol ettiğimiz zaman thumnailPhoto bölümünde değer olduğunu görebiliyoruz.

Active Directory Kullanıcılarına Toplu Fotoğraf Eklemek
Active Directory ortamımızda bulunan kullanıcılara toplu şekilde fotoğraf eklemek isterseniz, enterprise ürünler bulunduğu gibi PowerShell kullanarakda fotoğraf ekleyebiliriz.
Öncelikle CSV dosyası hazırlamamız gerekmektedir, oluşturacağımız CSV dosyası aşağıdaki gibi gözükmektedir.
Fotoğraflar ilgili ilgili kullanıcının ismini içermesi gerekmektedir.
AD_user,path_to_file
User1,C:\Photos\user1.jpg
User2,C:\Photos\user2.jpg
CSV dosyamızı hazırladıktan sonra aşağıdaki powershell komutlarını çalıştırarak CSV dosyamızda belirttiğimiz kullanıcılara fotoğraf ekleme işlemi tamamlanmış olacak.
Import-Csv C:\Photos\photos.csv | ForEach-Object {
Set-ADUser -Identity $_.AD_user -Replace @{
thumbnailPhoto = [byte[]](Get-Content $_.path_to_file -Encoding byte)
}
}
Active Directory Kullanıcı Fotoğraflarını GPO ile Dağıtmak
Kullanıcı fotoğrafları için GPO hazırlamamız gerekmektedir, bu işlemle beraber kullanıcılarımıza hesap değiştirme izni vermemiz gerekmektedir. Bu işlemi GPO kullanarak Registry hazırlayarak sağlayacağız.
Bu işlem için yeni bir GPO oluşturacağım.

Oluşturduğumuz GPO’yu aşağıdaki yolu takip ederek düzenlememiz gerekmektedir:
Computer Configuration > Policies > Windows Settings > Security Settings > Registry
Registry – Add Key ile devam ediyoruz.

Select Registry ile aşağıda belirttiğim anahtara erişim izni vermemiz gerekmektedir.
MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users

Database Security bölümünden Domain/Users grubuna Full Control yetkisi vermemiz gerekmektedir.

Yetki işlemini onayladıktan sonra “Add Object” penceresi üzerinden “Replace existing permissions on all subkeys with inheritable permissions” (Alt anahtarlarıdaki mevcut izni devrealınabilen izinlerle değiştir) seçeneğini işaretliyoruz ve OK butonu ile devam etmemiz gerekmektedir.

Active Directory Kullanıcı Fotoğrafları için Group Policy Loopback Processing mode Yapılandırılması
Oluşturmuş olduğumuz Policy ile işlemlere devam ediyorum, kullanıcılar için gerekli yetkili Registry yapılandırılması ile sağlamıştım. Şimdi Group Policy Loopback Processing mode ile devam etmemiz gerekmektedir.
Loopback Processing Mode için aşağıdaki yolu takip etmemiz gerekmektedir;
Computer Configuration > Administrative Templates > System > Group Policy > Configure user Group Policy loopback processing mode
- Enabled yapıyoruz ve Mode seçeneğini Merge olarak değiştiriyoruz.

Bu işlemlerden sonra açılış sırasında kullanıcıların ThumbnailPhoto değerini okuyacak scriptimizi yapılandırmamız gerekmektedir.
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.
Active Directory Kullanıcı Fotoğraflarını Oturum Açılışında Otomatik Yüklemek
RSAT kurulumu yerine bir PowerShell scripti kullanarak, kullanıcıların Active Directory üzerindeki thumbnailPhoto
değerini alıp, bilgisayara profil fotoğrafı olarak atayabilirsiniz.
Active Directory Kullanıcı Fotoğraflarını Oturum Açma ekranında gösterme Scripti
- Fotoğraf yolları registry’e yazılır.
- Kullanıcının SID değeri alınır.
- Fotoğraf farklı çözünürlüklerde
C:\Users\Public\AccountPictures
klasörüne kaydedilir.
Paylaştığım scripti her kullanıcın eriştiği bir paylaşım klasörüne (Örn: NETLOGON) kaydetmeniz gerekmektedir.
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."
}
}
Bu scripti bir paylaşımlı klasöre (örneğin \\domain\netlogon
) kopyalayın ve GPO’ya ekleyin:
Oluşturmuş olduğumuz Policy ile düzenlemelere devam ediyorum, şimdi ilgili scripti Startup script olarak eklememiz gerekmektedir.
User Configuration > Windows Settings > Scripts (Logon)
Script Name: Paylaşım yolu girilmesi gerekmektedir.

Kullanıcı profil fotoğrafının doğru şekilde yüklendiğini görebilmek için oturumu iki kez açıp kapatmanız gerekebilir.
Active Directory Kullanıcısına Fotoğraf Ekleme İşleminin Doğrulanması
Fotoğraflar Windows kullanıcı girişi ekranında görüntülendikten sonra aşağıdaki yolları takip ederek doğrulama işlemi yapabilirsiniz
- Regedit ile
AccountPicture
altında kayıtları kontrol edilir.
C:\Users\Public\AccountPictures
klasöründeki fotoğraf dosyaları incelenebilir.
Windows Login ekranında yüklediğim fotoğrafı görebiliyorum.

Regedit ile doğrulama yapmak isterseniz aşağıdaki yolu takip edebilirsiniz.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users

Active Directory ortamınızda kullanıcı profil fotoğraflarını manuel ya da toplu olarak yükleyebilir, GPO üzerinden otomatik dağıtım yapabilir ve istemcilerde sorunsuz görünmesini sağlayabilirsiniz. Kullanıcı giriş ekranında fotoğrafların gözükmesini sağlayabilirsiniz, umarım faydalı bir makale olmuştur.