Active Directory OU yapısını PowerShell ile CSV dosyasına aktarmak ve kontrollü biçimde yeniden oluşturmak; lab kurulumu, yapı standardizasyonu ve OU tasarımının dokümantasyonu gibi senaryolarda oldukça kullanışlıdır. Bu rehberde OU ağacının dışa aktarılması, parent-child sırasının korunması, hedef domain bilgisinin uyarlanması ve içe aktarma sonrasında doğrulama adımlarını ele alıyorum.

Amaç ve Kapsam
Buradaki işlem kullanıcıları, bilgisayarları, GPO bağlantılarını veya OU üzerindeki tüm delegasyonları taşıyan tam bir Active Directory migration değildir. Amaç OU hiyerarşisini dışa aktarmak ve hedef ortamda aynı organizasyon yapısını yeniden oluşturabilmektir.
Ön Koşullar
- Active Directory PowerShell modülü
- Kaynak ortamda OU’ları okuyabilecek yetki
- Hedef ortamda OU oluşturabilecek yetki
- CSV dosyasının güvenli bir çalışma dizininde tutulması
- Üretim öncesinde lab veya kontrollü OU altında test
OU Yapısını İnceleme
Önce mevcut OU yapısını doğrudan görüntüleyin:
Get-ADOrganizationalUnit -Filter * |
Select-Object Name, DistinguishedName |
Sort-Object DistinguishedName
Bu çıktı, aktarım öncesinde beklenmeyen veya artık kullanılmayan OU’ları fark etmek için de yararlıdır.
OU Yapısını CSV’ye Aktarma
Bir OU yeniden oluşturulurken -Name ile OU adı, -Path ile parent konumu gerekir. Bu nedenle DistinguishedName içinden parent path’i çıkartıp hiyerarşi derinliğini de kaydediyoruz:
$OUs = Get-ADOrganizationalUnit -Filter * | ForEach-Object {
[PSCustomObject]@{
Name = $_.Name
DistinguishedName = $_.DistinguishedName
OUPath = $_.DistinguishedName -replace '^.+?,',''
Depth = ([regex]::Matches($_.DistinguishedName, 'OU=')).Count
}
}
$OUs |
Sort-Object Depth |
Export-Csv 'C:TempOUTree.csv' -NoTypeInformation -Encoding UTF8
Depth alanı önemlidir. Parent OU oluşturulmadan child OU oluşturulmaya çalışılırsa işlem başarısız olur. Bu nedenle içe aktarma sırasında düşük derinlikteki OU’lar önce işlenmelidir.
CSV Çıktısını Doğrulama
Import-Csv 'C:TempOUTree.csv' |
Sort-Object {[int]$_.Depth} |
Format-Table Name, OUPath, Depth -AutoSize
İçe aktarmadan önce OUPath değerlerini özellikle kontrol edin. Kaynak ve hedef domain DNS adları farklıysa CSV’deki DC= bileşenlerinin hedef domain yapısına göre uyarlanması gerekir.
Hedef Domain İçin Path Dönüştürme
Örneğin kaynak DN sonu DC=lab,DC=local, hedef ise DC=lab2,DC=local ise CSV üzerinde kontrollü dönüşüm yapılabilir. Gerçek üretim domain bilgilerini script içine sabitlemek yerine değişken kullanmak daha güvenlidir:
$SourceBase = 'DC=lab,DC=local'
$TargetBase = 'DC=lab2,DC=local'
$OUs = Import-Csv 'C:TempOUTree.csv'
$OUs | ForEach-Object {
$_.OUPath = $_.OUPath -replace [regex]::Escape($SourceBase), $TargetBase
}
$OUs | Export-Csv 'C:TempOUTree-Target.csv' -NoTypeInformation -Encoding UTF8
OU Yapısını İçe Aktarma
Önce -WhatIf ile hangi işlemlerin yapılacağını görün:
$OUs = Import-Csv 'C:TempOUTree-Target.csv' |
Sort-Object {[int]$_.Depth}
foreach ($OU in $OUs) {
New-ADOrganizationalUnit `
-Name $OU.Name `
-Path $OU.OUPath `
-WhatIf
}
Çıktı beklendiği gibiyse -WhatIf kaldırılarak gerçek oluşturma işlemi yapılabilir.
Doğrulama
İçe aktarma tamamlandıktan sonra hedef ortamın OU listesini yeniden alın:
Get-ADOrganizationalUnit -Filter * |
Select-Object Name, DistinguishedName |
Sort-Object DistinguishedName
Kaynak ve hedef CSV’leri karşılaştırmak, eksik veya yanlış path ile oluşturulmuş OU’ları tespit etmeyi kolaylaştırır.
Troubleshooting
The object does not exist hatası
Genellikle parent OU henüz oluşturulmamıştır veya OUPath hedef domain ile eşleşmiyordur. Depth sırasını ve DN bileşenlerini kontrol edin.
Object already exists hatası
Hedef ortamda aynı OU zaten bulunuyor olabilir. Toplu çalıştırmadan önce mevcut yapıyı envanterleyin; scripti doğrudan tekrar çalıştırmak yerine mevcut nesneleri kontrol eden idempotent bir yaklaşım kullanın.
Access is denied
Hedef container veya parent OU üzerinde OU oluşturma yetkisini ve varsa delegasyon modelini kontrol edin.
Güvenlik ve Best Practice
- CSV dosyasında gerçek kurum/domain bilgileri bulunuyorsa dosyayı herkese açık konumlarda tutmayın.
- Üretim ortamında doğrudan toplu oluşturma yerine önce
-WhatIfkullanın. - OU ağacını taşımadan önce eski veya gereksiz OU’ları temizleme fırsatı olarak değerlendirin.
- GPO linkleri, delegasyonlar ve OU içindeki nesnelerin bu işlemle otomatik taşınmadığını unutmayın.
- Kaynak ve hedef yapıyı işlem sonunda ayrı ayrı raporlayın.
Sonuç
PowerShell ile OU yapısını CSV’ye aktarmak, Active Directory organizasyon modelini dokümante etmek ve kontrollü biçimde yeniden oluşturmak için pratik bir yöntemdir. Güvenilir bir aktarım için asıl kritik noktalar parent-child sırasını korumak, hedef DistinguishedName yapısını doğru dönüştürmek ve değişiklikleri uygulamadan önce doğrulamaktır.
