如何过滤 EventLog 以每天获取一个日志 - PowerShell

Posted

技术标签:

【中文标题】如何过滤 EventLog 以每天获取一个日志 - PowerShell【英文标题】:How to Filter EventLog to get one log per a day - PowerShell 【发布时间】:2019-12-24 13:37:34 【问题描述】:

我编写了 powershell 脚本来获取特定用户的登录位置。 但我希望每天只获得一个结果

脚本运行良好,但每天都会产生很多结果。

这是我的脚本:

$StartDate = Get-Date -Year 2019 -Month 12 -Day 01 
$computers = Get-ADComputer -SearchBase 'ou=XXX,dc=XXX,dc=org,dc=XX' -Filter "Name -like 'XXXX*'" 
foreach ($comp in $computers)  
    $Computer = $comp.Name 
    Get-WinEvent -max 3 -Computername $Computer -FilterHashtable @LogName='Security';ID='4624' ;StartTime=$StartDate  | 
    where ($.Id -eq '4624') -and ($.properties[8].value -eq 3) -and ($.properties[5].value -eq 'XXXXX') |
    select-Object -Property TimeCreated, MachineName , @ Name = 'TargetUserName'; Expression =  $.Properties[5].Value  

【问题讨论】:

代码在每个 $_ 自动值上都缺少下划线,因此不应运行。修复该问题后,如果您只想要一个结果,请以 -First 1 结束 Select-Object 您好,代码工作正常。我不是在寻找最后一个或一个结果。我想每天得到一个结果。 对不起,我一开始误解了所需的输出。我用新代码编辑了我的答案,每天输出一个事件。 【参考方案1】:

如评论所述,代码缺少 $_ 自动变量的下划线。 另外,我建议在 startDate 上使用.Date 来省略时间部分,有效地将其设置为午夜。

# set the startdate, remove the time part so it wil be the date at midnight
$StartDate = (Get-Date -Year 2019 -Month 12 -Day 01 ).Date
$LogonUser = 'XXXXX'
$computers = Get-ADComputer -SearchBase 'ou=XXX,dc=XXX,dc=org,dc=XX' -Filter "Name -like 'XXXX*'" 

foreach ($comp in $computers)  
    $Computer =  $comp.Name 
    Get-WinEvent -Computername $Computer -FilterHashtable @LogName='Security';ID=4624;StartTime=$StartDate  | 
    Where-Object ($_.Properties[8].Value -eq 3) -and ($_.Properties[5].Value -eq $LogonUser)  |
    Select-Object -Property TimeCreated, MachineName, 
                            @ Name = 'TargetUserName'; Expression =  $_.Properties[5].Value   |
    Group-Object @Expression = $_.TimeCreated.Date | ForEach-Object  
        $_.Group | Select-Object -First 1
    

对于那些想知道$_.Properties的人:

$_.Properties[5].Value --> TargetUserName
$_.Properties[8].Value --> LogonType. Value = 3 --> Network

见:Audit logon events

【讨论】:

感谢您的回答,但它仍然只给我一个结果(最后一个)。 @ReuvenB.S ..不在我的机器上。但是,我删除了-MaxEvents 100,因为这可能还不够。否则,请尝试删除 -and ($_.Properties[5].Value -eq $LogonUser) 看看你会得到什么。【参考方案2】:

您的固定代码是:

StartDate = Get-Date -Year 2019 -Month 12 -Day 01 
$computers = Get-ADComputer -SearchBase 'ou=XXX,dc=XXX,dc=org,dc=XX' -Filter "Name -like 'XXXX*'" 
foreach ($comp in $computers)  $Computer = $comp.Name Get-WinEvent -max 3 -Computername $Computer -FilterHashtable 
@LogName='Security';ID='4624' ;StartTime=$StartDate  | where ($_.Id -eq '4624') -and ($_.properties[8].value -eq 3) -and ($._properties[5].value -eq 'XXXXX') | select-Object -Property TimeCreated, MachineName , @ Name = 'TargetUserName'; Expression =  $_.Properties[5].Value    -first 1

请注意,我在where-objectselect-object cmdlet 中添加了几个下划线,并且需要select-object 之后的一个结果-first 1

【讨论】:

嗨,我只有一个结果。我想从 2019 年 12 月 1 日到今天的每一天得到一个结果。每天一个结果。谢谢

以上是关于如何过滤 EventLog 以每天获取一个日志 - PowerShell的主要内容,如果未能解决你的问题,请参考以下文章

我每天产生 2 GB 的 Web 服务器日志,如何过滤它们?

使用EventLog Analyzer进行日志取证分析

如何快速过滤出一次请求的所有日志?

控制台中EventLog实现事件日志操作

EventLog Analyzer能对网络环境中的那类日志进行采集?

EventLog Analyzer能对网络环境中的那类日志进行采集?