PowerShell ile Active Directory Günlüklerini Arama
Son birkaç haftadır Active Directory ile vakit geçiriyor ve PowerShell ile yönetim görevlerini otomatikleştiriyorum. Bir veya iki sayfa geri giderseniz paylaştığım bazı scriptleri ve işlevleri göreceksiniz. Bugün, Active Directory'deki değişikliklerin izlenmesiyle ilgili son yorumlarda ortaya çıkan bir konuya değinmek istiyorum. Mantıklı bir soru şudur: "Değişikliği kim yaptı?". Ayrıca "Neyi değiştirdiler?" PowerShell tek başına tüm bu yanıtları alamaz. Yeterli boyutta bir Active Directory altyapısı çalıştırıyorsanız, kurumsal düzeyde yönetim araçlarına yatırım yapacağınızı umuyorum. Paylaştığım kod, kendi işini yapmaktan başka seçeneği olmayan küçük mağazalar için uygundur. Veya bir boşluğu doldurmanız ve kısa vadeli bir sorunu çözmeniz gereken durumlar için.
Olay Günlüğü Kazma
Active Directory'de kimin değişiklik yaptığı hakkında istediğiniz bilgiyi almak için olay günlüklerini incelemeniz gerekecektir. Özellikle Güvenlik olay günlüğünü sorgulamanız gerekir. Daha da spesifik olmak gerekirse, Active Directory'ye yazabilen bir etki alanı denetleyicisindeki Güvenlik olay günlüğünü sorgulamanız gerekir. Yönetici DOM1'de bir kullanıcı hesabını etkinleştirdiğinde Güvenlik olay günlüğüne bir giriş yapılır. Açıkçası, DOM2'deki Güvenlik olay günlüğündeki değişikliği görmezsiniz.
Benim önermem ve size göstereceğim kod, Windows sunucularındaki varsayılan olay günlüğü ayarlarını varsayar. Günlükleri iletiyorsanız veya bunları üçüncü taraf bir çözümle yönetiyorsanız koduma bakarken bunu dikkate almanız gerekir. Size göstereceğim bilgiler Güvenlik olay günlüğündedir ve sunucuya özeldir. Bu günlükleri nasıl yöneteceğiniz size bağlıdır.
Daha derine inmeden önce kısa bir uyarıda bulunayım. Her kuruluşun olay günlüğü yönetimine ilişkin kendi politikaları ve prosedürleri vardır. Yalnızca bilgiler Güvenlik olay günlüğünden temizlenmediyse Active Directory ile ilgili değişiklikleri sorgulayabilirsiniz. Bu, günlük dosyalarınızın ihtiyaçlarınızı karşılayacak kadar büyük olduğundan emin olmanız gerekebileceği anlamına gelir. Test etki alanımda, boyutu 1 GB'a çıkarmak için bu komutu çalıştırdım.
limit-eventlog -LogName security -ComputerName dom2,dom1 -MaximumSize 1024MBKullanıcı Yönetimi Etkinlikleri
Kullanıcı yönetimi etkinliklerine odaklanacağım. Her olay türü bir olay kimliğine bağlıdır. İşte kullandığım hileli karma tablosu.
# a hashtable of user management event IDs for the Security event log
$ADEvent = @{
UserChanged = 4738
UserCreated = 4720
UserDeleted = 4726
UserEnabled = 4722
UserDisabled = 4725
}Bir AD kullanıcı hesabını yönettiğinizde, aynı etkinlik için birden fazla günlük girişi alabilirsiniz. Örneğin, bir kullanıcı hesabı oluşturup etkinleştirirseniz büyük olasılıkla UserCreated ve UserEnabled olaylarını görürsünüz. Muhtemelen bir UserChanged de var. Bunu aklınızda tutun.
Olay günlüğünü sorgulamak için Get-WinEvent'in nasıl kullanılacağını öğrenmenizi önereceğim. Daha fazla sorgulama esnekliği sunuyor, biraz daha hızlı (sanırım) ve PowerShell 7'ye ulaştığınızda sahip olacağınız tek araç bu. Yardım ve örnekleri okuyacağınız konusunda size güveneceğim. Bu arada, işte bir örnek.
Get-WinEvent -FilterHashtable @{Logname = 'Security';ID=4720;Starttime="2/1/2021"} -ComputerName dom1Bu, 1 Şubat 2021'den bu yana DOM1'de kaydedilen tüm kullanıcı oluşturma etkinliklerine yönelik sorgulamadır.
Mesaj detayına geçelim.
Olay günlüğü girişi Konuyu, etkinlikten sorumlu hesabı ve Hedefi gösterecektir. Bu durumda Şirket\Yönetici, Şirket\L.Kuja'yı yaratmış gibi görünüyor. Bu hesabın nerede oluşturulduğu hakkında hiçbir fikrim yok ama bunu Get-ADUser ile her zaman arayabilirim.
Bunu hazırlarken, özellik listesine de dikkat çekmek istiyorum. Bir kullanıcı hesabı değiştirildiğinde, olay günlüğüne kaydedilen özellikler yalnızca bunlardır. Bir kullanıcının Departmanını veya Unvanını değiştirirsem bu, Güvenlik olay günlüğü tarafından yakalanmaz. Bu tür bir denetim takibi sizin için önemliyse üçüncü taraf yönetim ürünlerine yönelmenizin nedeni budur.
Get-ADUserAudit
Bu sınırlamaları göz önünde bulundurarak Get-ADUserAudit adında bir PowerShell işlevi yazdım. Belirli bir zamandan bu yana günlüğe kaydedilen farklı türde kullanıcı yönetimi olayları için bir veya daha fazla etki alanı denetleyicisinde arama oluşturmaya yönelik parametrelere sahiptir.
Get-ADUserAudit -event created,deleted -since "2/1/2021"
Varsayılan davranış, tüm çoğaltma etki alanı denetleyicilerini aramaktır.
İşlev, varsayılan özel biçim görünümüne sahip olan ardışık düzene özel bir nesne yazar. Çıktıyı kısaca açıklayayım. DomainController, Before ve EventType özellikleri apaçık olmalıdır. Hedefler özelliği, belirli bir etkinlik için tanımlanan tüm kullanıcı hesaplarının bir koleksiyonudur. TargetCount, kaç kullanıcı hesabı olduğunu görmenin hızlı bir yoludur. Başka bir deyişle, 1 Şubat'tan bu yana DOM1'de 5 kullanıcı hesabı oluşturuldu (veya en azından oturum açıldı). Yöneticiler, etkinliklerle ilişkili tüm yönetici hesaplarını gösterir. Yani aynı dönemde Yönetici, AprilS ve ArtD hesapları oluşturdu. Sonuç size hangi yöneticinin hangi kullanıcı hesabını oluşturduğunu söylemez. Bu bilgiyi almak için olay günlüğünü tekrar incelemeniz gerekir.
Elbette sonuçları istediğiniz gibi özelleştirebilirsiniz.
Get-ADUserAudit -event created,deleted,enabled,disabled -outvariable a | sort-object eventtype | format-table -GroupBy eventtype -Property since,domaincontroller,targetcountVeya olayları özetlemenin bir yolu var.
$a | group-object eventtype -ov b | select-object @{Name="Since";Expression={$a[0].Since}},Name,@{Name="Total";Expression = { ($_.group.targetcount | measure-object -sum).sum}}$A önceki komutumun kaydedilen sonucudur.
Bu sık sık çalıştırmak istediğim bir şey olsaydı, biraz yazmaktan tasarruf etmek için bir kontrol komut dosyası oluştururdum. Hatta bunu daha da ileri götürebilirim çünkü kendime engel olamıyorum ve bunu bir HTML sürümü oluşturup e-postayla göndermek için planlanmış bir iş olarak ayarlayabilirim.
Kod nerede?
Tüm bunları nasıl yaptığımı görmek veya kodu alıp kendiniz denemek isterseniz, dosyaları bu Github özetinden indirebilirsiniz. İlgili bir notta, PSScriptTools modülünün bir parçası olan Convert-EventLogRecord komutu da ilginizi çekebilir. Bu komut, olay günlüğü kayıtlarından bilgilerin ayrıştırılmasını kolaylaştırır.
Get-WinEvent -FilterHashtable @{Logname = 'Security';ID=4720;Starttime="2/1/2021"} -ComputerName dom2 |
Convert-EventLogRecord |
Format-table -GroupBy Computername -Property ID,TimeCreated,
@{Name="Admin";Expression={"$($_.SubjectDomainName)\$($_.SubjectUsername)"}},
@{Name="Account";Expression = { (Get-ADuser $_.samaccountname).DistinguishedName }}
Artık hangi yöneticinin hangi hesabı oluşturduğunu açıkça görebiliyorum.
Ne düşündüğünüzü veya bunlardan herhangi birinin yararlı olup olmadığını bana bildirin.






