Active Directory’de Kullanıcıya Verilmiş Delegasyon Yetkilerini Tespit Etmek
Kurumsal ortamlarda Active Directory (AD) altyapısı, merkezi kimlik yönetiminin temel taşıdır. Ancak AD ortamında yetkilerin kimlere nasıl verildiği zamanla karmaşıklaşabilir. Özellikle delegasyon yoluyla belirli Organizational Unit (OU) nesneleri üzerinde kullanıcı veya gruplara verilen özel erişim hakları, güvenlik açıklarına sebep olabilecek şekilde görünmez hale gelebilir.
Bu yazıda sizlerle, belirli bir kullanıcının Active Directory içerisindeki tüm OU’lar üzerinde sahip olduğu delegasyon yetkilerini tespit eden bir PowerShell betiği paylaşıyor ve nasıl çalıştığını adım adım açıklıyorum.
Bu Betik Ne İşe Yarar?
Bu PowerShell betiği, bir kullanıcının Active Directory içerisindeki tüm Organizational Unit (OU) nesneleri üzerinde sahip olduğu doğrudan delegasyon yetkilerini analiz eder ve kullanıcıya atanmış olan erişim izinlerini detaylı bir şekilde raporlar.
Kullanım Senaryoları
- Güvenlik denetimleri sırasında kimlere hangi yetkilerin verildiğini görmek.
- Bir kullanıcıya yapılan delegasyonların doğruluğunu ve gerekliliğini kontrol etmek.
- Sistemden ayrılan personelin sahip olduğu özel erişimleri tespit ederek kaldırmak.
- En az ayrıcalık prensibine (least privilege) göre kullanıcı izinlerini yeniden yapılandırmak
Betik, aşağıdaki adımları izleyerek çalışır:
Hedef Kullanıcının SID Bilgisini Alma
İlk adımda, SAMAccountName
ile belirtilen kullanıcının Security Identifier (SID) bilgisi alınır. SID, ACL (Access Control List) girdilerinde kullanıcıyı tanımlamak için kullanılır.
$user = Get-ADUser -Identity $targetSamAccountName -Properties SID
Tüm OU’ların Listelenmesi
Active Directory içindeki tüm OU’lar, Distinguished Name (DN) bilgileriyle birlikte alınır.
$OUs = Get-ADOrganizationalUnit -Filter * | Select-Object -ExpandProperty DistinguishedName
GUID-İsim Eşleştirme Tablosunun Oluşturulması
D güvenlik izinleri içinde GUID’ler ile ifade edilen nesne türleri ve özel haklar, okunabilir isimlere çevrilmek üzere çözülür. Bu, schemaIDGUID
ve rightsGUID
alanlarının çözülmesini sağlar.
Get-ADObject -SearchBase (Get-ADRootDSE).schemaNamingContext
Her OU Üzerinde Yetki Kontrolü
Her OU’nun güvenlik tanımlayıcısı (ACL) alınır ve bu listede hedef kullanıcının SID’siyle eşleşen girdiler analiz edilir.
Aşağıda Scriptin tam hali bulunmaktadır.
# Kullanıcıyı SAMAccountName ile belirtin (örnek: sadece "hvadmin")
$targetSamAccountName = "hvadmin"
try {
# Kullanıcının SID'sini al
$user = Get-ADUser -Identity $targetSamAccountName -Properties SID
$targetSID = $user.SID.Value
}
catch {
Write-Host "Kullanıcı '$targetSamAccountName' bulunamadı. Lütfen doğru yazıldığından emin olun." -ForegroundColor Red
return
}
# Tüm OU'ları al
$OUs = Get-ADOrganizationalUnit -Filter * | Select-Object -ExpandProperty DistinguishedName
# GUID açıklama tablosu oluştur
$schemaIDGUID = @{}
$ErrorActionPreference = 'SilentlyContinue'
# Şema nesneleri (GUID → İsim çeviri)
Get-ADObject -SearchBase (Get-ADRootDSE).schemaNamingContext -LDAPFilter '(schemaIDGUID=*)' -Properties name, schemaIDGUID |
ForEach-Object { $schemaIDGUID[[guid]$_.schemaIDGUID] = $_.name }
# Extended rights (GUID → İsim çeviri)
Get-ADObject -SearchBase "CN=Extended-Rights,$((Get-ADRootDSE).configurationNamingContext)" -LDAPFilter '(objectClass=controlAccessRight)' -Properties name, rightsGUID |
ForEach-Object { $schemaIDGUID[[guid]$_.rightsGUID] = $_.name }
$ErrorActionPreference = 'Continue'
$report = @()
# OU'ları tarayıp erişim kontrol listelerini analiz et
foreach ($OU in $OUs) {
try {
$acl = Get-Acl -Path "AD:\$OU"
foreach ($entry in $acl.Access) {
$entrySID = try {
(New-Object System.Security.Principal.NTAccount($entry.IdentityReference)).Translate([System.Security.Principal.SecurityIdentifier]).Value
} catch { $null }
if ($entrySID -eq $targetSID) {
$report += [PSCustomObject]@{
organizationalUnit = $OU
identityReference = $entry.IdentityReference
accessControlType = $entry.AccessControlType
activeDirectoryRights = $entry.ActiveDirectoryRights
isInherited = $entry.IsInherited
objectTypeName = if ($entry.ObjectType -eq [guid]::Empty) {'All'} else { $schemaIDGUID[$entry.ObjectType] }
inheritedObjectTypeName = $schemaIDGUID[$entry.InheritedObjectType]
inheritanceType = $entry.InheritanceType
}
}
}
}
catch {
Write-Warning "OU '$OU' için ACL alınamadı: $_"
}
}
# Sonuçları göster
if ($report.Count -gt 0) {
$report | Out-GridView -Title "Delegasyon Yetkileri: $($user.SamAccountName)"
}
else {
Write-Host "Kullanıcı '$($user.SamAccountName)' için hiçbir OU’da doğrudan delegasyon bulunamadı." -ForegroundColor Yellow
}
Elde Edilen Bilgilerin Raporlanması
Kullanıcıya ait yetkiler, aşağıdaki detaylarla bir tabloya eklenir:
- OU (Organizational Unit)
- IdentityReference (kimlik)
- AccessControlType (Allow/Deny)
- ActiveDirectoryRights (okuma, yazma, oluşturma vb.)
- Inheritance bilgisi (kalıtım olup olmadığı)
- ObjectTypeName (nesne türü)
- InheritedObjectTypeName (kalıtılan nesne türü)
- InheritanceType (None, All, Descendents vb.)
Betiğin ürettiği çıktıya örnek SBP\hvadmin kullanıcısına, AD’de bulunan OU=_Sunucular,DC=sbp,DC=local üzerinde GenericAll (tam yetki) verilmiş. Bu yetki doğrudan atanmış ve tüm nesne türlerini kapsıyor.

Active Directory’de delegasyon karmaşık ve çoğu zaman görünmez bir yapıdır. Bu PowerShell betiği sayesinde, bir kullanıcının sahip olduğu yetkileri net biçimde görebilir, analiz edebilir ve gerektiğinde düzeltebilirsiniz.
Siz de bu scripti kendi güvenlik denetim süreçlerinize entegre ederek, Active Directory yapınızı daha şeffaf ve yönetilebilir hale getirebilirsiniz.
Bu Bilgilerin Faydalı Olması Dileğiyle…