Я пытаюсь создать сценарий PowerShell, который по сути автоматизирует инструменты блокировки учетной записи. в идеале я смогу получить довольно эффективный запрос, который может идентифицировать недавно заблокированные учетные записи, затем получить эти данные из наших DC и, возможно, отправить электронное письмо, сообщающее нам, кто был заблокирован, и копию «сообщения» из журнала безопасности .
вот что у меня есть до сих пор: я читал, что для использования Get-WinEvent мы должны использовать хеш-таблицу, поэтому я создал объект хеш-таблицы и расширил переменные datetime в хеш-таблицу, и они выглядят правильно, и если я запустил что-то вроде $ hash.starttime | gm, я могу подтвердить, что это все еще объект system.datetime.
$LockedOut = Get-ADUser -Properties AccountLockoutTime,LastBadPasswordAttempt,BadPwdCount,LockedOut -Filter * | ?{$_.AccountLockOutTime -ge (Get-Date).AddHours(-3)}
$LockedOut | ft name,samaccountname,LockedOut,AccountLockoutTime,BadPwdCount,LastBadPasswordAttempt
$DomainControllers = Get-ADDomainController -Filter *
ForEach($lockeduser in $LockedOut)
{
$lockeduser.Name
ForEach($DC in $DomainControllers.name)
{
$before = ($lockeduser.AccountLockoutTime.AddMinutes(1)).date
$after = ($lockeduser.AccountLockoutTime.AddMinutes(-1)).date
$hash = $null
$hash = @{}
$hash.Add("Logname", "security")
$hash.Add("Starttime", $after)
$hash.Add("Endtime", $before)
$DC
$messagecriteria = $lockeduser.Name
$message = Get-WinEvent -ComputerName $DC -FilterHashtable $hash | ?{$_.Message -like "*$messagecriteria*"}
$message
}
"----------------------------------------------------------------------------------------------------------"
}
Но когда я запускаю запрос, я только возвращаюсь
Get-WinEvent : No events were found that match the specified selection criteria.
At line:19 char:20
+ $message = Get-WinEvent -ComputerName $DC -FilterHashtable $hash | ?{$_ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (:) [Get-WinEvent], Exception
+ FullyQualifiedErrorId : NoMatchingEventsFound,Microsoft.PowerShell.Commands.GetWinEventCommand
Кажется, я заставил это работать. Я думаю, что некоторые переменные свойства застревали в памяти, и из-за этого запрос предоставлял неправильные временные рамки.
вот готовый продукт для всех, кто интересуется, запрос был усилен, теперь он извлекает только 2-секундные журналы для анализа и просматривает только последние 10 минут. Также есть сегмент для записи результатов в пользовательский PSobject, который полезен для экспорта в CSV или HTML.
осталось только вставить HTML-заголовок и записать его в таблицу, которая появится в электронном письме.
$LockedOut = Get-ADUser -Properties AccountLockoutTime,LastBadPasswordAttempt,BadPwdCount,LockedOut -Filter * | ?{$_.AccountLockOutTime -ge (Get-Date).AddMinutes(-10)}
$LockedOut | ft name,samaccountname,LockedOut,AccountLockoutTime,BadPwdCount,LastBadPasswordAttempt
$DomainControllers = Get-ADDomainController -Filter *
$results = $null
ForEach($lockeduser in $LockedOut)
{
$lockedusername = $lockeduser.name
ForEach($DC in $DomainControllers.name)
{
$starttime = $lockeduser.AccountLockoutTime.AddSeconds(-1)
$endtime = $lockeduser.AccountLockoutTime.AddSeconds(1)
$hash = $null
$hash = @{}
$hash.Add("Logname", "security")
$hash.Add("Starttime", $starttime)
$hash.Add("Endtime", $endtime)
"$lockedusername - Locating Events between $starttime and $endtime on $DC..."
$messagecriteria = $lockeduser.Name
$message = Get-WinEvent -ComputerName $DC -FilterHashtable $hash | ?{$_.Message -like "*$messagecriteria*"}
$message |ft @{Expression={$ExecutionContext.InvokeCommand.ExpandString($lockeduser.Name)};Label="Name"}, `
@{Expression={$ExecutionContext.InvokeCommand.ExpandString($lockeduser.SamAccountName)};Label="SAMID"},machinename,TimeCreated,ID,message
$hash.Clear()
$TC = $message.timecreated
$ID = $message.id
$messagetext = $message.message
IF($message -ne $null)
{
ForEach($line in $message)
{
$obj = New-Object -TypeName PSObject
$obj | Add-Member -NotePropertyName "Name" -NotePropertyValue $LockedUser.name
$obj | Add-Member -NotePropertyName "SamID" -NotePropertyValue $LockedUser.SamAccountName
$obj | Add-Member -NotePropertyName "DC" -NotePropertyValue $DC
$obj | Add-Member -NotePropertyName "TimeCreated" -NotePropertyValue $line.TimeCreated
$obj | Add-Member -NotePropertyName "Event ID" -NotePropertyValue $line.ID
$obj | Add-Member -NotePropertyName "Message" -NotePropertyValue $line.message
[Array]$results += $obj
}
}
}
"----------------------------------------------------------------------------------------------------------"
}
"Table of results"
$results | ft