Active Directory Yönetiminde wc Komutu ile Kelime ve Satır Sayma

Active Directory ortamında çalışırken, kullanıcı hesaplarını, grup üyeliklerini veya politika nesnelerini saymanız gereken anlar mutlaka gelir. İşte tam bu noktada wc komutu, sysadmin’in en sadık yardımcılarından biri haline gelir. Evet, wc bir Linux aracıdır, ama Active Directory yönetiminde PowerShell pipeline’ı ve hatta Windows Subsystem for Linux (WSL) üzerinden kullanıldığında inanılmaz derecede faydalı olabilir. Bu yazıda, wc komutunun Active Directory yönetimindeki pratik kullanım senaryolarını ele alacağız.

wc Komutu Nedir ve Ne İşe Yarar?

wc (word count), adından da anlaşılacağı üzere kelime, satır ve karakter sayma işlemi yapan bir Unix/Linux komutudur. Ama sysadmin dünyasında çok daha geniş bir anlam taşır: bir komutun çıktısındaki kayıt sayısını öğrenmek, log dosyalarındaki satır sayısını kontrol etmek, ya da bir listenin boyutunu hızlıca anlamak için kullanılır.

Temel parametreler:

  • -l: Satır sayısını gösterir (line count)
  • -w: Kelime sayısını gösterir (word count)
  • -c: Byte sayısını gösterir (byte count)
  • -m: Karakter sayısını gösterir (character count)
  • -L: En uzun satırın uzunluğunu gösterir

Active Directory ortamında en çok kullanacağınız parametre -l olacak, çünkü çoğu durumda “kaç kayıt var?” sorusuna cevap arıyorsunuz.

WSL ile Active Directory Yönetiminde wc Kullanımı

Windows Server ortamında wc kullanmanın en pratik yolu, WSL (Windows Subsystem for Linux) ile PowerShell çıktısını birleştirmektir. Hadi gelelim gerçek dünya senaryolarına.

Senaryo 1: Domain’deki Toplam Kullanıcı Sayısını Bulmak

Bir sabah patronunuz gelip “Domain’de kaç kullanıcı hesabı var?” diye sorduğunda, birkaç dakika içinde kesin cevap vermek istersiniz. PowerShell ile bunu zaten yapabilirsiniz, ama wc pipeline’ı daha da akıcı hale getirir.

PowerShell üzerinden:

# PowerShell ile tüm kullanıcıları listele ve wc ile say
Get-ADUser -Filter * | Measure-Object | Select-Object -ExpandProperty Count

WSL üzerinden aynı işlemi wc ile yapıyorsak:

# WSL bash ortamında, powershell.exe çağrısıyla
powershell.exe -Command "Get-ADUser -Filter * | Select-Object -ExpandProperty SamAccountName" | wc -l

Bu yaklaşım özellikle bir bash script içinde AD verilerini işleyeceğinizde işe yarıyor. Çıktıdaki her satır bir kullanıcı adı olduğu için, -l parametresi doğrudan kullanıcı sayısını verir.

Senaryo 2: Devre Dışı Hesapları Saymak

Periyodik AD temizliği yapıyorsunuz ve kaç tane disabled hesap olduğunu görmek istiyorsunuz:

# Disabled kullanıcı hesaplarını say
powershell.exe -Command "Get-ADUser -Filter {Enabled -eq 'False'} | Select-Object SamAccountName" | wc -l

Bu çıktı size disabled hesap sayısını verir. Eğer bu sayıyı düzenli olarak takip etmek istiyorsanız, bir bash script içine koyabilirsiniz:

#!/bin/bash
# ad_health_check.sh - AD sağlık kontrolü scripti

TOTAL_USERS=$(powershell.exe -Command "Get-ADUser -Filter * | Measure-Object | Select-Object -ExpandProperty Count" 2>/dev/null | tr -d '[:space:]')

DISABLED_USERS=$(powershell.exe -Command "Get-ADUser -Filter {Enabled -eq 'False'} | Select-Object SamAccountName" 2>/dev/null | wc -l)

LOCKED_USERS=$(powershell.exe -Command "Search-ADAccount -LockedOut | Select-Object SamAccountName" 2>/dev/null | wc -l)

echo "=== AD Kullanici Raporu ==="
echo "Toplam kullanici: $TOTAL_USERS"
echo "Disabled hesaplar: $DISABLED_USERS"
echo "Kilitli hesaplar: $LOCKED_USERS"
echo "Rapor tarihi: $(date)"

Bu script, sabah görevine eklenerek her gün otomatik çalıştırılabilir ve size anlık bir AD sağlık özeti sunar.

Active Directory Log Dosyalarında wc Kullanımı

Active Directory’nin ürettiği log dosyaları, problem tespitinde altın değerindedir. Ama bu loglar bazen devasa boyutlara ulaşabilir. wc burada devreye girerek log dosyasının boyutu hakkında hızlı bir fikir edinmenizi sağlar.

LDAP Log Analizi

LDAP bağlantı hatalarını analiz ederken:

# LDAP log dosyasındaki toplam satır sayısı
wc -l /var/log/ldap/slapd.log

# Sadece hata içeren satırları say
grep -i "error" /var/log/ldap/slapd.log | wc -l

# Belirli bir tarihte kaç authentication denemesi olduğunu bul
grep "2024-01-15" /var/log/ldap/slapd.log | grep -i "bind" | wc -l

Active Directory Event Log Dışa Aktarma Analizi

Windows Event Viewer’dan CSV olarak dışa aktardığınız logları analiz ederken:

# Dışa aktarılan event log dosyasındaki kayıt sayısı
wc -l AD_Security_Events.csv

# Başlık satırını çıkar ve gerçek kayıt sayısını bul
tail -n +2 AD_Security_Events.csv | wc -l

# 4625 (başarısız oturum açma) event'lerini say
grep "4625" AD_Security_Events.csv | wc -l

Bu son örnek özellikle kritik. Bir güvenlik olayı şüphesi varsa, kaç tane başarısız oturum açma girişimi olduğunu saniyeler içinde öğrenebilirsiniz.

Grup Üyelik Yönetiminde wc

Active Directory’de grup yönetimi, sysadmin’lerin en çok vakit harcadığı alanlardan biridir. wc ile grup üyelik kontrollerini çok daha verimli yapabilirsiniz.

Senaryo 3: Domain Admins Grubundaki Üye Sayısı

# Domain Admins grubundaki kullanıcı sayısını kontrol et
powershell.exe -Command "Get-ADGroupMember -Identity 'Domain Admins' | Select-Object Name" | wc -l

Bu sayının beklenmedik şekilde artması, bir güvenlik ihlalinin işareti olabilir. Bu yüzden bu kontrol, günlük otomasyonunuzun parçası olmalı.

Senaryo 4: Boş Grupları Tespit Etmek

Büyük bir AD ortamında onlarca belki yüzlerce boş grup bulunabilir. Bu grupları tespit edip temizlemek, hem güvenlik hem de yönetim kolaylığı açısından önemlidir:

#!/bin/bash
# empty_groups_checker.sh

echo "Bos AD gruplarini kontrol ediliyor..."

# Tüm grupları al ve her birinin üye sayısını kontrol et
powershell.exe -Command "
Get-ADGroup -Filter * | ForEach-Object {
    $members = Get-ADGroupMember -Identity $_.Name -ErrorAction SilentlyContinue
    if ($members.Count -eq 0) {
        Write-Output $_.Name
    }
}" 2>/dev/null > /tmp/empty_groups.txt

EMPTY_COUNT=$(wc -l < /tmp/empty_groups.txt)
echo "Bos grup sayisi: $EMPTY_COUNT"
echo "Liste: /tmp/empty_groups.txt"

if [ "$EMPTY_COUNT" -gt 20 ]; then
    echo "UYARI: Cok fazla bos grup var! Temizlik yapilmali."
fi

OU Yapısı Analizi

Organizational Unit (OU) yapınızın ne kadar karmaşık olduğunu anlamak için de wc kullanabilirsiniz.

# Toplam OU sayısını öğren
powershell.exe -Command "Get-ADOrganizationalUnit -Filter * | Select-Object DistinguishedName" | wc -l

# Belirli bir OU altındaki kullanıcı sayısı
powershell.exe -Command "Get-ADUser -Filter * -SearchBase 'OU=Istanbul,DC=sirket,DC=local' | Select-Object SamAccountName" | wc -l

# Tüm OU'ları hiyerarşik listele ve sat sayısını kontrol et
powershell.exe -Command "Get-ADOrganizationalUnit -Filter * | Select-Object -ExpandProperty DistinguishedName | Sort-Object" | wc -l

Group Policy Nesnelerini Saymak

GPO yönetimi de wc ile çok daha kolay hale gelir:

# Toplam GPO sayısı
powershell.exe -Command "Get-GPO -All | Select-Object DisplayName" | wc -l

# Bağlı olmayan (unlinked) GPO sayısı - bunlar genellikle temizlenebilir
powershell.exe -Command "
Get-GPO -All | Where-Object {
    $_ | Get-GPOReport -ReportType XML | Select-String -Pattern 'LinksTo' -NotMatch
} | Select-Object DisplayName" 2>/dev/null | wc -l

Bağlı olmayan GPO’lar, zamanla birikir ve yönetimi zorlaştırır. Bu sayıyı düzenli kontrol etmek iyi bir pratik.

Stale (Bayat) Hesapları Tespit Etme

Active Directory’deki en yaygın sorunlardan biri, uzun süredir kullanılmayan hesaplardır. Bu hesapları tespit edip saymak için:

#!/bin/bash
# stale_accounts.sh - 90 gunden uzun sure giris yapilmamis hesaplari say

echo "Stale hesap analizi basliyor..."

# 90 günden fazla süre önce logon yapılmış veya hiç yapılmamış hesaplar
STALE_USERS=$(powershell.exe -Command "
$cutoffDate = (Get-Date).AddDays(-90)
Get-ADUser -Filter {LastLogonDate -lt $cutoffDate -and Enabled -eq 'True'} 
    -Properties LastLogonDate | 
    Select-Object SamAccountName, LastLogonDate" 2>/dev/null | wc -l)

echo "90 gunden uzun sure kullanilmayan aktif hesap: $STALE_USERS"

# Hiç giriş yapmamış yeni hesaplar
NEVER_LOGGED=$(powershell.exe -Command "
Get-ADUser -Filter {LastLogonDate -notlike '*' -and Enabled -eq 'True'} 
    -Properties LastLogonDate | 
    Select-Object SamAccountName" 2>/dev/null | wc -l)

echo "Hic giris yapmamis aktif hesap: $NEVER_LOGGED"

Parola Politikası ve Güvenlik Kontrolleri

Parola süresi dolmuş hesapları saymak, güvenlik ekibine düzenli raporlama yapmanız gerektiğinde çok işe yarıyor:

# Parolası süresi dolmuş hesapları say
powershell.exe -Command "Search-ADAccount -PasswordExpired | Select-Object SamAccountName" | wc -l

# Parolası bir daha değiştirilmeyecek şekilde ayarlanmış hesaplar
powershell.exe -Command "Get-ADUser -Filter {PasswordNeverExpires -eq 'True'} | Select-Object SamAccountName" | wc -l

Bu iki kontrolü bir araya getirip günlük bir güvenlik raporu oluşturabilirsiniz:

#!/bin/bash
# daily_security_report.sh

REPORT_FILE="/var/log/ad_security/report_$(date +%Y%m%d).txt"
mkdir -p /var/log/ad_security

{
    echo "AD Gunluk Guvenlik Raporu - $(date)"
    echo "==========================================="
    echo ""
    
    echo "Kilitli hesaplar:"
    LOCKED=$(powershell.exe -Command "Search-ADAccount -LockedOut | Select-Object SamAccountName" 2>/dev/null | wc -l)
    echo "  Sayi: $LOCKED"
    
    echo ""
    echo "Parolasi süresi dolmus hesaplar:"
    EXPIRED=$(powershell.exe -Command "Search-ADAccount -PasswordExpired | Select-Object SamAccountName" 2>/dev/null | wc -l)
    echo "  Sayi: $EXPIRED"
    
    echo ""
    echo "PasswordNeverExpires aktif hesaplar:"
    NEVER_EXP=$(powershell.exe -Command "Get-ADUser -Filter {PasswordNeverExpires -eq 'True' -and Enabled -eq 'True'} | Select-Object SamAccountName" 2>/dev/null | wc -l)
    echo "  Sayi: $NEVER_EXP"
    
    echo ""
    echo "Domain Admins uye sayisi:"
    DA_COUNT=$(powershell.exe -Command "Get-ADGroupMember 'Domain Admins' | Select-Object Name" 2>/dev/null | wc -l)
    echo "  Sayi: $DA_COUNT"
    
} > "$REPORT_FILE"

echo "Rapor olusturuldu: $REPORT_FILE"
cat "$REPORT_FILE"

wc ile Karşılaştırmalı Analiz

wc‘nin gerçek gücü, zaman içinde değişimi takip etmekte ortaya çıkıyor. Bir önceki günün sayısını bugünkü ile karşılaştırmak, anormal durumları hemen fark etmenizi sağlar:

#!/bin/bash
# compare_ad_counts.sh - Gunluk degisim analizi

TODAY_FILE="/tmp/ad_count_today.txt"
YESTERDAY_FILE="/tmp/ad_count_yesterday.txt"

# Dünün verisini sakla
[ -f "$TODAY_FILE" ] && mv "$TODAY_FILE" "$YESTERDAY_FILE"

# Bugünün verisini al
TOTAL=$(powershell.exe -Command "Get-ADUser -Filter * | Measure-Object | Select-Object -ExpandProperty Count" 2>/dev/null | tr -d '[:space:]')
echo "$TOTAL" > "$TODAY_FILE"

# Karşılaştır
if [ -f "$YESTERDAY_FILE" ]; then
    YESTERDAY=$(cat "$YESTERDAY_FILE")
    DIFF=$((TOTAL - YESTERDAY))
    
    echo "Dun: $YESTERDAY kullanici"
    echo "Bugun: $TOTAL kullanici"
    echo "Degisim: $DIFF"
    
    if [ "$DIFF" -gt 50 ]; then
        echo "KRITIK UYARI: 24 saatte $DIFF yeni hesap acildi!"
        # Buraya e-posta veya Slack bildirimi eklenebilir
    elif [ "$DIFF" -lt -10 ]; then
        echo "UYARI: 24 saatte $DIFF hesap silindi veya devre disi birakildi!"
    fi
fi

Bu tür bir script, beklenmedik toplu hesap oluşturma veya silme işlemlerini anında fark etmenizi sağlar. Siber güvenlik açısından bu çok kritik bir göstergedir.

Dikkat Edilmesi Gereken Noktalar

wc kullanırken bazı önemli noktalara dikkat etmek gerekiyor:

  • Başlık satırları: PowerShell çıktıları genellikle başlık ve boşluk satırları içerir. Bu durum sayıyı 2-3 fazla gösterebilir. tail -n +3 ile başlık satırlarını atlayabilirsiniz.
  • Boş satırlar: Pipeline çıktılarında bazen boş satırlar oluşur. grep -v '^$' ile bunları filtreleyebilirsiniz.
  • Büyük domain’lerde performans: Onbinlerce kullanıcısı olan domain’lerde Get-ADUser -Filter * yavaş çalışabilir. Server-side filtreleme kullanmak her zaman daha iyidir.
  • Encoding sorunları: WSL ve Windows arasındaki karakter encoding farkları zaman zaman sorun çıkarabilir. iconv ile dönüşüm yapmanız gerekebilir.
  • Gerçek zamanlı veri: wc sayım yapar ama anlık değeri değil, komutun çalıştığı andaki veriyi gösterir. Kritik kararlar için birden fazla kaynak kullanın.

Sonuç

wc komutu, Active Directory yönetiminde başlangıçta küçük ve sıradan bir araç gibi görünebilir. Ama gerçek dünya senaryolarında, bu basit “satır sayaç” kendini defalarca kanıtlar. Kilitli hesap sayısını takip etmek, boş grupları tespit etmek, GPO düzenini kontrol etmek ya da günlük değişim analizleri yapmak gibi görevlerde wc size hem hız hem de güvenilirlik sağlar.

Önemli olan, bu aracı diğer araçlarla akıllıca birleştirmektir. PowerShell’in AD’ye olan derin entegrasyonu ile wc‘nin sadeliğini bir araya getirdiğinizde, otomasyon scriptleriniz hem okunabilir hem de güçlü hale gelir. Bu yazıdaki script örneklerini doğrudan kullanabilir ya da kendi ortamınıza göre uyarlayabilirsiniz. Her sysadmin’in araç kutusunda basit ama etkili araçlara yer olmalı; wc de kesinlikle bu araçlardan biridir.

Yorum yapın