Отчеты журнала событий Powershell - PullRequest
0 голосов
/ 05 июня 2018

Я работаю над сценарием PS, чтобы собирать определенные идентификаторы событий и выкладывать их обратно каждый час или около того.Я делаю это, потому что хочу выложить его в электронную почту для удобства чтения.

Моя проблема сейчас заключается в том, что скрипт будет работать до определенного момента и зависать.Если я удаляю фильтры даты, это работает хорошо.Как только я заново их добавляю (либо через переменные, либо через жестко запрограммированный код), он снова начинает зависать.Однако мне нужны фильтры даты, потому что в противном случае я получаю все, когда ищу почасовые куски.

Нужен совет, поскольку я хотел бы использовать переменные для разовых или модификаций!Я также хотел бы использовать ответвления для отчетности других сторон.

$filedate = (get-date).ToString("MM_dd_yy-hh_mm")
$filename = "bad_logins_DC01 " + $filedate + "_log.txt"
$after = (get-date).addhours(-1)
$before = (get-date)
$eventlog = Get-EventLog -ComputerName DC01 -LogName Security -After $after -Before $before

$eventlog | ?{$_.EventID -eq 4771 -or $_.EventID -eq 4776 } | Select @{Name="Event ID";Expression={$_.InstanceID}},@{Name="UserName";Expression={$_.ReplacementStrings[0]}},@{Name="Failure Code";Expression={$_.ReplacementStrings[4]}},@{Name="Host";Expression={$_.ReplacementStrings[6]}},@{Name="Port";Expression={$_.ReplacementStrings[7]}}, @{Name="Time";Expression={$_.TimeGenerated}} | ft | Out-File $filename -append -noclobber

$to = itsupport@ourdomain.com
$from = itsupport@ourdomain.com
$subject = $filename 
$smtp = exchange.ourdomain.com
$contents = cat $filename
$body = $contents

Send-MailMessage -SmtpServer $smtp -To $to -From $from -Subject $subject -Body $body -Attachments $filename

1 Ответ

0 голосов
/ 07 июня 2018

Понял!

Большое спасибо TheMadTechnicial за помощь в Get-WinEvent вместо Get-EventLog

$query_sec = @"
<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">*`
[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and `
TimeCreated[timediff(@SystemTime) &lt;= 7200000] and `
(EventID=4771 or EventID=4776)]]</Select>
  </Query>
</QueryList>
"@

$time = (Get-Date).ToString("dd-MM_hh-mm")
$to = "itsupport@mydomain.com"
$from = "me@mydomain.com"
$smtpServer = "mxserver.mydomain.com"

Try
 {
 $domain_controller = "DC01","C02","DC03"
      ForEach ($dc in $domain_controller) 
              {

              $Events = Get-WinEvent -ComputerName $dc -FilterXml $query_sec -ErrorAction Stop

         ForEach ($event in $Events) 
                  {

                     $eventXML = [xml]$Event.ToXml()

                     For ($i=0; $i -lt $eventXML.Event.EventData.Data.Count; $i++) 
                              {
                              Add-Member -InputObject $Event -MemberType NoteProperty -Force `
                                         -Name $eventXML.Event.EventData.Data[$i].Name `
                                         -Value $eventXML.Event.EventData.Data[$i].'#text'
                                               }
                                         }



    $filename = "C:\temp\"+$dc+"_failed_logins_"+$time+".txt"


    $Events | Select-Object @{Name="UID";Expression={$_.TargetUserName}},`
                ServiceName,`
                @{Name="Error";Expression={$_.Status}},`
                @{Name="IP";Expression={$_.IpAddress}},`
                @{Name="Port";Expression={$_.IpPort}},`
                @{Name="Event ID";Expression={$_.ID}},`
                @{Name="Source";Expression={$_.MachineName}}`
                | FT `
                | Out-File $filename 


    $subject = "Bad Logins on " + $dc + " at " + $time
    $body = Get-Content -Path $filename -Raw


    Send-MailMessage -To $to -Subject $subject -From $from -SmtpServer $smtpServer -Body $body
        }
    }

Catch [Exception]
    {
    Write-Output " "
    Write-Output "$dc has no relevant event logs!"
    }
...