Active Directory Kullanıcı Fotoğrafını Windows Oturum Açma Görüntüsü Olarak Yapılandırma

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.

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.

thumbnailPhoto

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
thumbnailphoto none

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}
thumbnailsingleobject

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

thumnailobjectattribute

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.

newgpo

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.

registrygpoaddkey

Select Registry ile aşağıda belirttiğim anahtara erişim izni vermemiz gerekmektedir.

MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users
selectregistrykeygpo

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

databasesecurity

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.
loopbackprocessingmode

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.

PowerShell scripts logon

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.

image 12

Regedit ile doğrulama yapmak isterseniz aşağıdaki yolu takip edebilirsiniz.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users
accountpicture

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.

Yorum yapın