Active Directory Yönetimi: Temel Kavramlar ve En İyi Uygulamalar
Büyük bir şirketin sistem yöneticisisin ve Pazartesi sabahı işe geliyorsun. Masanda bir not var: “Active Directory kullanıcı sayısı 2000’i geçti, yönetim artık çok zor.” Bu tam olarak Organizational Unit yapısının devreye girmesi gereken an. OU’lar olmadan Active Directory, içinden çıkılmaz bir karmaşaya dönüşür. Doğru bir OU hiyerarşisi kurmak hem GPO uygulamalarını kolaylaştırır hem de delegasyon yapmanı, yetki devretmeni sağlar. Bu yazıda sıfırdan OU tasarımı yapacağız, PowerShell ile otomatize edeceğiz ve gerçek dünya senaryolarıyla pekiştireceğiz.
OU Nedir ve Neden Bu Kadar Önemli?
Active Directory’de Organizational Unit, nesneleri (kullanıcılar, bilgisayarlar, gruplar, yazıcılar) mantıksal olarak gruplandırmak için kullandığımız konteynerlerdir. Ama sadece “klasör” gibi düşünmek büyük hata olur. OU’ların üç temel işlevi vardır:
- GPO Bağlama: Group Policy Object’leri doğrudan OU’lara bağlarsın. Bir OU’daki tüm nesneler o politikayı alır.
- Delegasyon: Helpdesk ekibine sadece belirli bir OU üzerinde parola sıfırlama yetkisi verebilirsin, Domain Admin yapmak zorunda kalmazsın.
- Yönetim kolaylığı: Arama, filtreleme ve toplu işlemler çok daha hızlı olur.
Container objelerinden (CN=Users gibi) farkı şudur: Varsayılan containerlara GPO bağlayamazsın. Bu yüzden yeni kullanıcıları hemen uygun OU’ya taşımak kritik önem taşır.
Tasarım Öncesi Sorman Gereken Sorular
Klavyeye basmadan önce şirketin yapısını anlamak gerekiyor. Ben her yeni projeye başlarken şu soruları sorarım:
- Şirketin coğrafi yapısı nasıl? İstanbul, Ankara, İzmir ofisleri var mı?
- Departman yapısı ne? IT, Muhasebe, Satış, İnsan Kaynakları?
- GPO’lar departman bazında mı yoksa lokasyon bazında mı uygulanacak?
- Hangi ekipler hangi nesneleri yönetecek? (Delegasyon planı)
- Bilgisayarlar iş istasyonu ve sunucu olarak ayrılacak mı?
Bu sorulara verilen cevaplara göre coğrafi model, departman modeli veya hibrit model seçilir. Ben genellikle orta ve büyük ölçekli kurumlar için hibrit modeli öneriyorum.
Gerçek Dünya Senaryosu: TechCorp A.Ş.
Bu yazı boyunca örnek şirketimiz TechCorp A.Ş. üzerinden gideceğiz. Şirketin şu özellikleri var:
- İstanbul (merkez), Ankara ve İzmir ofisleri mevcut
- Departmanlar: IT, Muhasebe, Satış, İnsan Kaynakları, Yönetim
- 2 helpdesk çalışanı var, bunlar parola sıfırlama yapabilmeli
- Tüm dizüstü bilgisayarlara BitLocker açılacak
- Muhasebe bilgisayarlarına USB engeli getirilecek
Bu senaryo için tasarlayacağımız OU yapısı şöyle görünecek:
TechCorp.local
├── TR-Istanbul
│ ├── Kullanicilar
│ │ ├── IT
│ │ ├── Muhasebe
│ │ ├── Satis
│ │ ├── IK
│ │ └── Yonetim
│ ├── Bilgisayarlar
│ │ ├── Masaustu
│ │ ├── Dizustu
│ │ └── Sunucular
│ └── Gruplar
├── TR-Ankara
│ ├── Kullanicilar
│ ├── Bilgisayarlar
│ └── Gruplar
└── TR-Izmir
├── Kullanicilar
├── Bilgisayarlar
└── Gruplar
PowerShell ile OU Yapısını Oluşturma
Tek tek ADUC (Active Directory Users and Computers) üzerinden tıklamak yerine PowerShell ile tüm yapıyı dakikalar içinde kurabilirsin. İlk adımda temel OU’ları oluşturalım:
# Active Directory modülünü yükle
Import-Module ActiveDirectory
# Domain Distinguished Name'i değişkene ata
$DomainDN = "DC=TechCorp,DC=local"
# Ana lokasyon OU'larını oluştur
$Lokasyonlar = @("TR-Istanbul", "TR-Ankara", "TR-Izmir")
foreach ($Lokasyon in $Lokasyonlar) {
New-ADOrganizationalUnit -Name $Lokasyon `
-Path $DomainDN `
-Description "$Lokasyon Ofisi" `
-ProtectedFromAccidentalDeletion $true
Write-Host "$Lokasyon OU'su olusturuldu." -ForegroundColor Green
}
Şimdi her lokasyon altına alt OU’ları ekleyelim:
# Her lokasyon icin alt OU'lari olustur
$AltOUlar = @("Kullanicilar", "Bilgisayarlar", "Gruplar")
foreach ($Lokasyon in $Lokasyonlar) {
$LokasyonDN = "OU=$Lokasyon,$DomainDN"
foreach ($AltOU in $AltOUlar) {
New-ADOrganizationalUnit -Name $AltOU `
-Path $LokasyonDN `
-ProtectedFromAccidentalDeletion $true
Write-Host " $AltOU olusturuldu: $LokasyonDN" -ForegroundColor Cyan
}
# Kullanicilar altindaki departman OU'lari
$Departmanlar = @("IT", "Muhasebe", "Satis", "IK", "Yonetim")
$KullaniciDN = "OU=Kullanicilar,OU=$Lokasyon,$DomainDN"
foreach ($Dept in $Departmanlar) {
New-ADOrganizationalUnit -Name $Dept `
-Path $KullaniciDN `
-ProtectedFromAccidentalDeletion $true
}
# Bilgisayarlar altindaki kategoriler
$BilgisayarTipleri = @("Masaustu", "Dizustu", "Sunucular")
$BilgisayarDN = "OU=Bilgisayarlar,OU=$Lokasyon,$DomainDN"
foreach ($Tip in $BilgisayarTipleri) {
New-ADOrganizationalUnit -Name $Tip `
-Path $BilgisayarDN `
-ProtectedFromAccidentalDeletion $true
}
}
Write-Host "Tum OU yapisi basariyla olusturuldu!" -ForegroundColor Yellow
Mevcut OU Yapısını Görüntüleme ve Doğrulama
Oluşturduktan sonra yapının doğru kurulduğunu kontrol etmek için şu komutu kullanabilirsin:
# Tum OU'lari listele ve hiyerarsik goster
Get-ADOrganizationalUnit -Filter * -Properties Description |
Select-Object Name, DistinguishedName, Description |
Sort-Object DistinguishedName |
Format-List
# Sadece belirli bir lokasyonun altindaki OU'lari gormek icin
$HedefOU = "OU=TR-Istanbul,DC=TechCorp,DC=local"
Get-ADOrganizationalUnit -Filter * -SearchBase $HedefOU |
Select-Object Name, DistinguishedName |
Format-Table -AutoSize
Toplu Kullanıcı Taşıma İşlemi
TechCorp’a yeni katıldın ve 500 kullanıcı hala CN=Users konteynerinde duruyor. Bunları uygun OU’lara taşımak için önce kullanıcı verilerinin doğru doldurulması gerekiyor. Department alanı dolu olan kullanıcıları otomatik taşıyalım:
# Department bilgisine gore kullanicilari otomatik OU'ya tasi
$DepartmanOU = @{
"IT" = "OU=IT,OU=Kullanicilar,OU=TR-Istanbul,DC=TechCorp,DC=local"
"Muhasebe" = "OU=Muhasebe,OU=Kullanicilar,OU=TR-Istanbul,DC=TechCorp,DC=local"
"Satis" = "OU=Satis,OU=Kullanicilar,OU=TR-Istanbul,DC=TechCorp,DC=local"
"Insan Kaynaklari"= "OU=IK,OU=Kullanicilar,OU=TR-Istanbul,DC=TechCorp,DC=local"
"Yonetim" = "OU=Yonetim,OU=Kullanicilar,OU=TR-Istanbul,DC=TechCorp,DC=local"
}
# CN=Users icindeki kullanicilari getir
$Kullanicilar = Get-ADUser -Filter * `
-SearchBase "CN=Users,DC=TechCorp,DC=local" `
-Properties Department
foreach ($Kullanici in $Kullanicilar) {
if ($Kullanici.Department -and $DepartmanOU.ContainsKey($Kullanici.Department)) {
$HedefOU = $DepartmanOU[$Kullanici.Department]
try {
Move-ADObject -Identity $Kullanici.DistinguishedName -TargetPath $HedefOU
Write-Host "$($Kullanici.SamAccountName) --> $($Kullanici.Department)" -ForegroundColor Green
}
catch {
Write-Warning "Hata: $($Kullanici.SamAccountName) tasinamadi. $_"
}
} else {
Write-Warning "$($Kullanici.SamAccountName) icin departman bilgisi eksik veya eslesme yok."
}
}
Delegasyon: Yetkiyi Doğru Kişiye Ver
TechCorp’un helpdesk ekibi sabah 9’dan akşam 6’ya kadar çalışıyor. Birisi parolasını unuttuğunda IT müdürünü aramak yerine helpdesk çözüm üretmeli. Ama helpdesk ekibine Domain Admin vermek delililik olur. Delegasyon tam burada devreye giriyor.
GUI üzerinden delegasyon yapmak için ADUC’ta OU’ya sağ tıklayıp “Delegate Control” diyebilirsin. Ama PowerShell ile yapmak çok daha ölçeklenebilir:
# Helpdesk grubuna parola sifirlama yetkisi ver
# Once helpdesk grubunu olustur
New-ADGroup -Name "Helpdesk-Operatorleri" `
-GroupScope Global `
-GroupCategory Security `
-Path "OU=Gruplar,OU=TR-Istanbul,DC=TechCorp,DC=local"
# ACL delegasyonu icin gerekli tanimlamalar
$HelpdeskGrubu = Get-ADGroup "Helpdesk-Operatorleri"
$HelpdeskSID = [System.Security.Principal.SecurityIdentifier] $HelpdeskGrubu.SID
# Hedef OU'nun ACL'ini al
$HedefOU = "OU=Kullanicilar,OU=TR-Istanbul,DC=TechCorp,DC=local"
$ACL = Get-Acl -Path "AD:$HedefOU"
# Parola sifirlama izni tanimla
# GUID: bf967a6e-0de6-11d0-a285-00aa003049e2 = User nesnesi
# GUID: 00299570-246d-11d0-a768-00aa006e0529 = Reset Password izni
$ResetPasswordGUID = [GUID]"00299570-246d-11d0-a768-00aa006e0529"
$UserObjectGUID = [GUID]"bf967a6e-0de6-11d0-a285-00aa003049e2"
$ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
$HelpdeskSID,
[System.DirectoryServices.ActiveDirectoryRights]::ExtendedRight,
[System.Security.AccessControl.AccessControlType]::Allow,
$ResetPasswordGUID,
[System.DirectoryServices.ActiveDirectorySecurityInheritance]::Descendents,
$UserObjectGUID
)
$ACL.AddAccessRule($ACE)
Set-Acl -Path "AD:$HedefOU" -AclObject $ACL
Write-Host "Helpdesk delegasyonu tamamlandi." -ForegroundColor Green
GPO ile OU Entegrasyonu
OU yapısının en güçlü yanı GPO bağlamak. TechCorp senaryosunda iki politikamız vardı: Dizüstü bilgisayarlara BitLocker ve Muhasebe bilgisayarlarına USB engeli.
GPO oluşturmak ve OU’ya bağlamak için:
# Gerekli modul
Import-Module GroupPolicy
# Dizustu bilgisayarlar icin BitLocker GPO'su olustur
$BitLockerGPO = New-GPO -Name "Dizustu-BitLocker-Politikasi" `
-Comment "Tum dizustu bilgisayarlarda BitLocker'i etkinlestirir"
# GPO'yu ilgili OU'ya bagla
$DizustuOU = "OU=Dizustu,OU=Bilgisayarlar,OU=TR-Istanbul,DC=TechCorp,DC=local"
New-GPLink -Name "Dizustu-BitLocker-Politikasi" `
-Target $DizustuOU `
-LinkEnabled Yes `
-Enforced No
# Muhasebe USB engel politikasini olustur ve bagla
$USBGPOAdi = "Muhasebe-USB-Engel-Politikasi"
New-GPO -Name $USBGPOAdi -Comment "Muhasebe bilgisayarlarinda USB depolama engeli"
$MuhasebeOU = "OU=Muhasebe,OU=Kullanicilar,OU=TR-Istanbul,DC=TechCorp,DC=local"
New-GPLink -Name $USBGPOAdi `
-Target $MuhasebeOU `
-LinkEnabled Yes
# Mevcut GPO baglantilarini listele
Get-GPInheritance -Target $MuhasebeOU |
Select-Object -ExpandProperty GpoLinks |
Format-Table DisplayName, Enabled, Enforced
Write-Host "GPO baglantilari tamamlandi." -ForegroundColor Yellow
OU’ları Yanlışlıkla Silmekten Koruma
Bir gün birisi yanlışlıkla ana OU’yu silerse büyük felaket olur. ProtectedFromAccidentalDeletion özelliği bunu önler ama mevcut OU’larda bu ayarı kontrol etmek gerekir:
# Korumasiz OU'lari bul ve koru
$KorumasizOUlar = Get-ADOrganizationalUnit -Filter * -Properties ProtectedFromAccidentalDeletion |
Where-Object { $_.ProtectedFromAccidentalDeletion -eq $false }
if ($KorumasizOUlar) {
Write-Warning "$($KorumasizOUlar.Count) adet korumasiz OU bulundu!"
foreach ($OU in $KorumasizOUlar) {
Set-ADOrganizationalUnit -Identity $OU.DistinguishedName `
-ProtectedFromAccidentalDeletion $true
Write-Host "Koruma aktif: $($OU.Name)" -ForegroundColor Green
}
} else {
Write-Host "Tum OU'lar korunuyor." -ForegroundColor Green
}
Sık Yapılan Hatalar ve Kaçınma Yolları
Yıllar içinde gördüğüm yaygın hatalara dikkat et:
- Çok derin hiyerarşi: 5-6 seviyeden derin OU yapıları yönetimi zorlaştırır. Maksimum 4 seviye yeterli.
- GPO bloat: Her OU’ya ayrı GPO bağlamak yerine üst OU’da genel politikalar uygula, alt OU’larda istisnaları yönet.
- Bilgisayarları varsayılan OU’da bırakmak: Yeni domain’e katılan bilgisayarlar CN=Computers’a düşer. Bunu değiştir:
# Yeni bilgisayarlar icin varsayilan OU'yu degistir
# Artik domain'e katilan her bilgisayar bu OU'ya dusar
redircmp "OU=Masaustu,OU=Bilgisayarlar,OU=TR-Istanbul,DC=TechCorp,DC=local"
# Kullanicilar icin de ayni islem
redirusr "OU=IT,OU=Kullanicilar,OU=TR-Istanbul,DC=TechCorp,DC=local"
- OU adlarında Türkçe karakter kullanmak: DN içinde sorun çıkarabilir. OU adlarında ASCII karakterler kullanmak daha güvenli.
- Delegasyonu belgelememek: Kim neye erişebiliyor bilmiyorsan güvenlik açığı var demektir. Her delegasyonu bir tabloya yaz, düzenli gözden geçir.
- Test ortamında denemeden production’a uygulamak: GPO değişikliklerini önce test OU’sunda dene.
OU Yapısını Düzenli Denetleme
Kurulum yaptın, sonra ne olacak? Altı ayda bir şu kontrolleri yapmanı öneririm:
# Bos OU'lari bul - icinde hicbir nesne olmayan OU'lar
$TumOUlar = Get-ADOrganizationalUnit -Filter *
foreach ($OU in $TumOUlar) {
$IcerikSayisi = (Get-ADObject -Filter * -SearchBase $OU.DistinguishedName `
-SearchScope OneLevel).Count
if ($IcerikSayisi -eq 0) {
Write-Warning "Bos OU: $($OU.Name) - $($OU.DistinguishedName)"
}
}
# OU basvurmayan GPO baglantilarini kontrol et
$TumGPOlar = Get-GPO -All
foreach ($GPO in $TumGPOlar) {
$GPOLinks = $GPO | Get-GPOReport -ReportType XML
# Hicbir yere baglanmayan GPO'lar gereksiz yuk olusturur
if ($GPO.LinksTo.Count -eq 0) {
Write-Warning "Bagli olmayan GPO: $($GPO.DisplayName)"
}
}
Sonuç
Active Directory OU tasarımı, “bir kere yap unut” işi değil. Şirket büyüdükçe, yapı değiştikçe OU hiyerarşini de revize etmen gerekecek. TechCorp örneğinde gördüğümüz gibi; iyi planlanmış bir OU yapısı GPO yönetimini basitleştirir, delegasyon sayesinde helpdesk’in verimliliğini artırır ve güvenlik açıklarını minimize eder.
Unutma: Tasarım aşamasına harcanan her saat, operasyonel aşamada on saat kazandırır. PowerShell scriptlerini kendi ortamına uyarlayarak başla, test domain controller üzerinde dene ve production’a almadan önce belgele. OU yapını bir Visio veya draw.io diyagramıyla görselleştirmek de hem ekip içi iletişimi kolaylaştırır hem de yeni gelen sistem yöneticilerinin hızla adapte olmasını sağlar.
Sorularını yorumlarda beklerim. Özellikle delegasyon ve GPO çakışmaları konusunda birçok ilginç senaryo var, o konuları da ayrıca ele alabiliriz.
