如何过滤 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-object
和select-object
cmdlet 中添加了几个下划线,并且需要select-object
之后的一个结果-first 1
。
【讨论】:
嗨,我只有一个结果。我想从 2019 年 12 月 1 日到今天的每一天得到一个结果。每天一个结果。谢谢以上是关于如何过滤 EventLog 以每天获取一个日志 - PowerShell的主要内容,如果未能解决你的问题,请参考以下文章
我每天产生 2 GB 的 Web 服务器日志,如何过滤它们?