Active Directory’de kullanıcı ve bilgisayar sayılarını OU bazında görmek; envanter kontrolü, OU temizliği, taşıma planı ve operasyonel raporlama sırasında yararlı olabilir. Bu rehberde PowerShell ile her OU için doğrudan nesne sayısını ve istenirse alt OU’ları kapsayan toplam sayıyı çıkaracağız.
Ön Koşullar
- RSAT Active Directory PowerShell modülü
- OU ve kullanıcı/bilgisayar nesnelerini okumaya yetkili hesap
- Raporlanacak OU yapısının Distinguished Name bilgisinin doğrulanması
Import-Module ActiveDirectory -ErrorAction Stop
Get-ADDomain
Get-ADOrganizationalUnit -Filter * | Select-Object -First 10 Name,DistinguishedName
Domain Genelindeki Kullanıcı ve Bilgisayar Sayısı
$UserCount = (Get-ADUser -Filter *).Count
$ComputerCount = (Get-ADComputer -Filter *).Count
[PSCustomObject]@{
Users = $UserCount
Computers = $ComputerCount
}
Büyük yapılarda yalnız ihtiyacınız olan OU’yu -SearchBase ile sınırlandırmak daha kontrollüdür.
Belirli Bir OU İçindeki Nesneleri Sayma
Aşağıdaki DN örnektir. OneLevel yalnız hedef OU’nun doğrudan altındaki nesneleri sayar.
$SearchBase = "OU=HeadOffice,DC=contoso,DC=com"
$Users = (Get-ADUser -Filter * -SearchBase $SearchBase -SearchScope OneLevel).Count
$Computers = (Get-ADComputer -Filter * -SearchBase $SearchBase -SearchScope OneLevel).Count
[PSCustomObject]@{
OU = $SearchBase
Users = $Users
Computers = $Computers
}
Alt OU’ları da Dahil Etmek
Hedef OU’nun tüm alt ağacını saymak için Subtree kullanabilirsiniz.
$Users = (Get-ADUser -Filter * -SearchBase $SearchBase -SearchScope Subtree).Count
$Computers = (Get-ADComputer -Filter * -SearchBase $SearchBase -SearchScope Subtree).Count
Tüm OU’lar İçin Kullanıcı ve Bilgisayar Raporu
Aşağıdaki script her OU’yu dolaşır ve yalnız o OU seviyesindeki kullanıcı/bilgisayar sayılarını raporlar. Böylece alt OU nesnelerinin üst OU toplamına tekrar eklenmesinden kaçınılır.
Import-Module ActiveDirectory -ErrorAction Stop
$OUs = Get-ADOrganizationalUnit -Filter * | Sort-Object DistinguishedName
$Report = foreach ($OU in $OUs) {
$UserCount = (Get-ADUser -Filter * -SearchBase $OU.DistinguishedName -SearchScope OneLevel).Count
$ComputerCount = (Get-ADComputer -Filter * -SearchBase $OU.DistinguishedName -SearchScope OneLevel).Count
[PSCustomObject]@{
OU = $OU.Name
DistinguishedName = $OU.DistinguishedName
Users = $UserCount
Computers = $ComputerCount
}
}
$Report | Format-Table -AutoSize
Raporu CSV’ye Aktarma
$OutputDirectory = Join-Path $env:SystemDrive "Exports"
$OutputCsv = Join-Path $OutputDirectory "AD_OU_Inventory.csv"
New-Item -Path $OutputDirectory -ItemType Directory -Force | Out-Null
$Report | Export-Csv -Path $OutputCsv -NoTypeInformation -Encoding UTF8
Doğrulama
OU raporlarında en kritik nokta OneLevel ile Subtree farkıdır. Ben önce birkaç bilinen OU üzerinde sonucu yönetim konsolundaki nesnelerle karşılaştırırım; ardından raporu tüm yapıya uygularım.
$Report | Sort-Object Users -Descending | Select-Object -First 10
$Report | Measure-Object -Property Users -Sum
$Report | Measure-Object -Property Computers -Sum
Performans ve Troubleshooting
Çok sayıda OU bulunan yapılarda her OU için ayrı LDAP sorgusu çalıştırmak zaman alabilir. Amaç yalnız domain toplamını bulmaksa OU döngüsü kullanmayın. OU bazlı dağılım gerekiyorsa script’i kontrollü bir yönetim istasyonundan çalıştırın.
SearchBase hatası: Distinguished Name değerini Get-ADOrganizationalUnit ile doğrulayın.
Beklenenden yüksek sayı: Subtree kullandığınızda alt OU nesnelerinin de dahil edildiğini unutmayın.
Güvenlik ve Best Practice
- Sayım için yüksek ayrıcalıklı yönetici hesabı kullanmayın.
- Gerçek domain adlarını veya kurum içi OU yapısını paylaşılacak scriptlere gömmeyin.
- Raporları erişim kontrollü konumlarda saklayın.
- Script’i önce sınırlı bir OU üzerinde doğrulayın.
İlgili Rehberler
Kullanıcı attribute’larını CSV olarak raporlamak için AD Kullanıcılarını CSV’ye Aktarma rehberini; Active Directory mimarisi için Active Directory Nedir? rehberini kullanabilirsiniz.
Sonuç
PowerShell ile OU bazlı kullanıcı ve bilgisayar sayımı yapılırken önce rapor kapsamı belirlenmelidir. OneLevel doğrudan OU seviyesini, Subtree ise alt OU’ları da kapsar. Bu ayrımı doğru yapmak envanter raporlarında yanlış toplamların önüne geçer.
