Использование Powershell Добирается-WinEvent с хеш-таблицей для запросов очень определенного диапазона времени

Я пытаюсь сделать powershell сценарий, который по существу автоматизирует инструменты локаута учетной записи. идеально я смогу получить довольно эффективный запрос, который может определить, что недавно заблокированные учетные записи затем получают те данные из нашего DC и вероятно посылают электронное письмо, сообщающее нам, кто был заблокирован и копия "сообщения" из журнала безопасности.

вот то, что я имею до сих пор: Я считал, что для использования Добираются-WinEvent, мы должны использовать хеш-таблицу, таким образом, я создал объект хеш-таблицы и расширился переменными даты и времени в хеш-таблицу, и они кажутся корректными, и если я выполняю что-то как $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
0
задан 14 October 2014 в 00:47
1 ответ

Кажется, я понял работать. Я думаю, что некоторые переменные свойства застревали в памяти, и это приводило к тому, что запрос предоставлял неправильные временные рамки.

вот готовый продукт для всех, кого это интересует, запрос был усилен, чтобы получать только 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
0
ответ дан 24 November 2019 в 09:00

Теги

Похожие вопросы