Active Directory ortamında bazı kişilere kullanıcıların parola değiştirme yetkisi vermemiz gerekebilmekte. Daha sonra herhangi bir nedenle kullanıcının parolasını kim değiştirmiş bilgisi gerekebilir.
Yetki verdiğimiz kişiler herhangi bir kullanıcının parolasını değiştirdiğinde işlem yaptığı Domain Controller üzerinde event log lara kaydedilmesi için daha öncesinde Default Domain Policy içinde “Audit User Account Management” seçeneğinin açık olması gerekmektedir.
NOT : Test ettiğimde bu ayar kapalı da olsa logların yazıldığını gözlemledim. Ancak yine de açılması diğer loglar için faydalı olacaktır. Bu uyarısı için Murat Yıldırımoğlu Beye teşekkür ederim.
Bunun için aşağıdaki GPO değerini Success ve Failure için enable edelim.
Başlayalım
Computer Configuration\Policies\Windows Settings\Security Settings\Advanced Audit Policy Configuration

Artık Domain Controller sunucularımız kullanıcı hesapları ile ilgili herşeyi event log a yazmaya başlayacak. Bizim bu makaledeki amacımız parola değişikliklerini görmek olduğu için 2 event id ile ilgileneceğiz.
Event ID = 4724 (Eski Windows Serverlarda 628) : Admin tarafından değiştirilen hesap işlemleri
Event ID = 4723 (Eski Windows Serverlarda 627) : Kullanıcı tarafından kendi parola değiştirme işlemleri
Her parola değiştirme logu işlem yapılan Domain Controller üzerinde loglanacağı için eğer ortamınızda 2 adet Domain Controller sunucunuz varsa her iki sunucuda Event Viewer da Security Loglarında Event ID ye göre filtreleme yapabilirsiniz. Ancak Domain Controller sunucu sayınız fazla ise tek tek bakmak zahmetli olacaktır.
Bunun için aşağıdaki powershell i herhangi bir Domain Controller üzerinde çalıştırabilrsiniz. Bu script tüm Domain Controllerların event loglarında belirteceğimiz 4724 id li logları getirecek.
(Get-ADComputer -SearchBase ‘OU=Domain Controllers,DC=astronur,DC=com’ -Filter *).Name | foreach { Get-WinEvent -ComputerName $_ -FilterHashtable @{LogName="Security";ID=4724 }| Foreach { $event = [xml]$_.ToXml() if($event) { $Time = Get-Date $_.TimeCreated -UFormat "%Y-%d-%m %H:%M:%S" $AdmUser = $event.Event.EventData.Data[4]."#text" $User = $event.Event.EventData.Data[0]."#text" $dc = $event.Event.System.computer write-host $AdmUser “ Kullanıcısı ” $User “ kullanıcısının parolasını ” $dc “ üzerinden “ $Time "da değiştirmiştir" } } }
Burada ilk satırda Domain Controller OU bilgisini kendinize göre düzenlemeniz gerekmektedir. Script Get-ADComputer komutu ile tüm dc lere tek tek bağlanıp Event log larını okuyacaktır.
Benzer şekilde tüm DC lerde ayrı ayrı loglanan aynı evet log ları bu scripti biraz düzenleyerek de toplayabilirsiniz.
Merhaba, script için teşekkür ederim. Bir ilave olarak “-ErrorAction SilentlyContinue” kullanılması olası “no match found” hatalarına karşı uygun olabilir.