0

我想知道如何检查整个 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"}}

但出现语法错误

4

2 回答 2

1

我认为问题在于您所追求的准确性。(包含小时、分钟和秒的日期,但没有毫秒)

当您创建一个比较 DateTime 对象时

$time = [datetime]'03/24/2021 20:50:37'

你会发现它的.MilliSecond属性设置为0。

当您将其与 eventsTimeCreated属性进行比较时,日期实际上具有与 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-WinEventcmdlet 返回具有许多属性的对象。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 *

于 2021-04-20T14:59:41.337 回答
0

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

所以左边的 arg 到 -eq 确定一个字符串比较:

get-winevent system | where '03/24/2021 20:50:37' -eq timecreated
于 2021-04-20T13:56:04.253 回答