Maila admin vid misslyckat inloggninsförsök med PowerShell

För ett tag sedan lyssnade jag på en session med WSUG där Mattias Lehmus tillsammans med Mikael Nyström visade mycket användbara automatiseringsvertyg.

Ett som jag blev väldigt intresserad av var just att maila admin vid misslyckat inloggningsförsök mot domänkontrollanterna och i mailet ser vi allt från datum, vilken användare det gäller och från vilken enhet. Helt fantastiskt eller hur?

Först måste vi aktivera själva loggningen av felaktiga inloggningar med Group Policy, här har jag valt att skapa en ny GPO på domännivå och aktiverat Audit account logon events – Success, Failure under Computer Configuration > Policies > Windows Settings > Security Settings > Local Policies/Audit Policy > Policy

Failed login attempts

Vi behöver denna GPO eller snarare att vi loggar failure som ger oss event 4771. Med detta event-ID kommer sedan vår schemaläggning att trigga scriptet för att skicka mailet. Men låt oss inte gå händelserna i förväg…

PowerShell scriptet:
Glöm inte att ändra variablerna efter din miljö.
Specificera det OU du vill övervaka först, för finns inte användaren i det OU så kommer scriptet inte att gå vidare, så smart!
Glöm inte att använda rätt info om SMTP-inställningar, se längre ned i inlägget om att använda Hotmails SMTP-server.

#Variables
$EventlogName = ”Security”
$EventID = ”4771”
$Date = get-date
$DomainControllers = [system.directoryservices.activedirectory.domain]::GetCurrentDomain() | ForEach-Object {$_.DomainControllers}
$OUSearchbase = ”OU=..,OU=..,DC=contoso,DC=com”
$AdminMail = ”mail@contoso.com”
$MailFrom = ”support@contoso.com”
$SMTPServer = ”mail.contoso.com”
$SMTPPort = ”25”
#Get Event
$Event = Get-EventLog -LogName $EventlogName -InstanceId $EventID -Newest 1 -Before $date
$EventTime = $event.TimeGenerated
#Get User and Computer information

#User Name and Mail
$UserName = $Event.ReplacementStrings[0]
$ADUser = Get-ADUser -SearchBase $OUSearchbase -filter {SamAccountName -eq $UserName} -Properties mail
IF($ADUser.count -eq 0){exit}
$UserEmail = $ADUser.mail

#Computer DNS Name
$ComputerIP = $Event.ReplacementStrings[6].Replace(”:”,””).Replace(”f”,””)
$ComputerName = ([System.Net.dns]::GetHostbyAddress($ComputerIP)).HostName

#Check if computer is domain controller and check with other Domain Controller if the failed login is made on the domaincontroller or other computer
ForEach($DomainController in $DomainControllers){
IF($ComputerIP -eq $DomainController.ipaddress){
$Event = Get-EventLog -LogName $EventlogName -InstanceId $EventID -Newest 1 -Before $date -ComputerName $ComputerName
$ComputerIP = $Event.ReplacementStrings[6].Replace(”:”,””).Replace(”f”,””)
$ComputerName = ([System.Net.dns]::GetHostbyAddress($ComputerIP)).HostName
}
}

#Send E-mail
IF($UserEmail.count -eq 0){
$Subject = ”Admin Account Failed login and Missing E-mail address”
$Body = @”
Failed Logon for user $UserName on computer $ComputerName with IP $ComputerIP on $EventTime

    The Admin Account is missing E-mail address, please add e-mail address to account $UserName
”@
Send-MailMessage -From $MailFrom -to $AdminMail -Subject $Subject -Body $Body -SmtpServer $SMTPServer -port $SMTPPort
}
IF($UserEmail.count -ne 0){
$Subject = ”Failed Admin Account Login”
$Body = @”
Failed Logon for user $UserName on computer $ComputerName with IP $ComputerIP on $EventTime
”@
Send-MailMessage -From $MailFrom -to $UserEmail -Subject $Subject -Body $Body -SmtpServer $SMTPServer -port $SMTPPort
}

Starta schemaläggaren och skapa en ny Basic Task med följande inställningar:

Task1Task2Task3

Log: Security
Source: Microsoft Windows security auditing.
Event ID: 4771

Task4Task5

Program/script:
C:\Windows\System32\cmd.exe
Add argument:
/C powershell.exe -executionpolicy bypass C:\Scripts\Failedlogin.ps1

Task6

Gå in på uppgiften du skapat och ändra så att schemaläggaren kan köra uppgifter vare sig om en användare eller inte är inloggad.

Då är det dags att testa. Kontrollera först så att användaren som du provar med finns med i det OU du specificerat i scriptet under $OUSearchBase och kontrollera även så att SMTP-servern du använder svarar och att du använder rätt port.

I min labbmiljö använde jag Hotmails SMTP-server och de har följande inställningar:

smtp.live.com
Port: 587 (TLS)

Om du vill labba med detta och använda exempelvis Hotmails SMTP-server så lägg till detta:

Under #Variables:

$smtpPassword = “ditt lösenord till din mail”
$Credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $MailFrom, $($smtpPassword | ConvertTo-SecureString -AsPlainText -Force)

Under #Send Email:
Byt ut båda Send-MailMessage mot denna rad:

Send-MailMessage -From $MailFrom -to $AdminMail -Subject $Subject -Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl -Credential $Credentials

Så här ser mailet ut när vi skrivit in fel lösenord.

mail

Tack Mattias & Mikael för tipsen!

Lämna en kommentar