Get-WinEvent 与匹配 TimeCreated
Posted
技术标签:
【中文标题】Get-WinEvent 与匹配 TimeCreated【英文标题】:Get-WinEvent with match TimeCreated 【发布时间】:2021-04-20 12:01:18 【问题描述】:我想知道如何检查整个 Windows 日志以查找与特定日期匹配的事件,例如: 目前在“系统”日志上停止:(
Get-WinEvent System | where $_.TimeCreated -eq "24.03.2021 20:50:37"
但结果什么也没显示。 我想使用脚本来搜索所有事件,而不仅仅是系统。 我需要将日期与事件相关联。 我的脚本如下所示:
(Get-WinEvent –ListLog * -ErrorAction SilentlyContinue).LogName | ForEach-Object Get-WinEvent | where $_.TimeCreated -eq "24.03.2021 20:50:37"
但出现语法错误
【问题讨论】:
比较TimeCreated
和另一个 DateTime
对象,而不是字符串。另外,您将其缩小到小时、分钟和秒。您真的需要那么严格吗?
是的,我需要非常准确的数据。
西奥的建议有用吗?
是的,theo 有效。
【参考方案1】:
我认为问题在于您所追求的准确性。 (包含小时、分钟和秒的日期,但没有毫秒)
当你创建一个比较 DateTime 对象时
$time = [datetime]'03/24/2021 20:50:37'
你会发现它的.MilliSecond
属性设置为0。
当您将此与事件TimeCreated
属性进行比较时,非常日期实际上具有相同的确切时间,而 MiliSecond 的值也为 0
。 .
这就是为什么您需要从事件的 TimeCreated
属性中删除毫秒(以及这些毫秒的分数),以便能够与确切的日期进行比较,但没有毫秒:
$time = [datetime]'03/24/2021 20:50:37'
(Get-WinEvent -LogName System) |
Where-Object ($_.TimeCreated.AddTicks(-$_.TimeCreated.Ticks % [timespan]::TicksPerSecond)) -eq $time
如果需要,您当然可以将其置于循环中以扫描不同的日志名称
根据您的评论,Get-WinEvent
cmdlet 返回具有许多属性的对象。 PowerShell 的标准方式是在屏幕上输出这些属性的 子集,在本例中为 TimeCreated, Id, LevelDisplayName and Message
。
如果您还想在此输出中显示事件日志的名称,请将 Select-Object 添加到命令中,例如:
$time = [datetime]'04/19/2021 08:38:20'
(Get-WinEvent –ListLog * -ErrorAction SilentlyContinue).LogName | ForEach-Object
Get-WinEvent -LogName $_ |
Where-Object ($_.TimeCreated.AddTicks(-$_.TimeCreated.Ticks % [timespan]::TicksPerSecond)) -eq $time |
# output the properties you are interested in
Select-Object LogName, TimeCreated, Id, LevelDisplayName, Message
为了使其更灵活,捕获结果在一个变量中,这样您既可以在屏幕上显示,也可以将结果保存到 Csv 文件以供日后检查:
$time = [datetime]'04/19/2021 08:38:20'
$result = (Get-WinEvent –ListLog * -ErrorAction SilentlyContinue).LogName | ForEach-Object
Get-WinEvent -LogName $_ |
Where-Object ($_.TimeCreated.AddTicks(-$_.TimeCreated.Ticks % [timespan]::TicksPerSecond)) -eq $time |
# output the properties you are interested in
Select-Object LogName, TimeCreated, Id, LevelDisplayName, Message
# output on screen
$result
# save to Csv File
$result | Export-Csv -Path 'Path\To\The\Output.csv' -NoTypeInformation -UseCulture
要查看返回的所有属性的名称,您可以这样做Get-WinEvent -LogName System | Select-Object -First 1 | fl *
【讨论】:
你的想法行得通!!!尝试使用 ForEach 将您的分辨率与所有日志合并,但没有运气:/ (Get-WinEvent –ListLog * -ErrorAction SilentlyContinue).LogName | ForEach-Object Get-WinEvent | Where-Object ($_.TimeCreated.AddTicks(-$_.TimeCreated.Ticks % [timespan]::TicksPerSecond)) -eq $time 显示很多错误。 @CurUser 您在评论中发布的内容似乎不完整。试试ForEach-Object Get-WinEvent -LogName $_ | Where-Object ...
这个 cmd 很好用:$time = [datetime]'04/19/2021 08:38:20' (Get-WinEvent –ListLog * -ErrorAction SilentlyContinue).LogName | ForEach-Object Get-WinEvent -LogName $_ | Where-Object ($_.TimeCreated.AddTicks(-$_.TimeCreated.Ticks % [timespan]::TicksPerSecond)) -eq $time
但不能让它与 Write-Host $_
一起工作以获取 name event log 找到详细日志的位置
@CurlUser 请看我的编辑。它解释了如何返回更多有用的属性【参考方案2】:
TimeCreated 是 DateTime 类型的属性,因此兼容的字符串效果更好。 (与 filterhashtable 的 starttime 不一样?)
Get-WinEvent system | select timecreated | select -first 1 | % timecreated |
% gettype
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DateTime System.ValueType
[datetime]'03/24/2021 20:50:37'
Wednesday, March 24, 2021 8:50:37 PM
# timecreated must have 0 milliseconds
get-winevent system | where timecreated -eq '03/24/2021 20:50:37'
毫秒问题的一个思路:
get-winevent system | where $_.timecreated.tostring() -eq '3/24/2021 8:50:37 PM'
我很惊讶这样的事情不起作用。
get-winevent system | where '3/24/2021 8:50:37 PM' -eq timecreated
'3/24/2021 8:50:37 PM' -eq [datetime]'3/24/2021 8:50:37 PM'
False
嗯,明白了。 Tostring() 不会以这种方式格式化时间。
[string][datetime]'3/24/2021 8:50:37 PM'
03/24/2021 20:50:37
'03/24/2021 20:50:37' -eq [datetime]'3/24/2021 8:50:37 PM'
True
所以 -eq 的左边 arg 决定了一个字符串比较:
get-winevent system | where '03/24/2021 20:50:37' -eq timecreated
【讨论】:
以上是关于Get-WinEvent 与匹配 TimeCreated的主要内容,如果未能解决你的问题,请参考以下文章
get-winevent -filterxpath 与 select-xml
get-winevent:将格式文件更改为 groupby 日志名无效