文章目录
前言
我每月都要给各种不同的客户做系统巡检,其中Windows事件日志检查是比较耗时的事情。它会记录许多的信息,特别是针对系统安全方面、系统故障排除方面有重要线索。我们可以通过一些事件关键字与信息,制作各种不同的脚本以便快速筛选过滤日志。
一般来说,我们可以通过如下两种方法实现日志过滤:
- Powershell => Win自带的命令行工具
- Log Parser 2.2 => 功能非常强大的第三方工具
PowerShell命令方法
Windows PowerShell提供两种不同的命令方式:
-
Get-WinEvent => 功能强大,但运用复杂;
-
Get-EventLog => 简单易用,可实时查询;
# 过滤安全日志的登录成功与失败日志
Get-EventLog Security -InstanceId 4624,4625
PowerShell常用命令
1. 检查服务器最近开关机时间
Function Get-ComputerUptimeHistory {
$q='
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">*[System[(EventID=6005 or EventID=6006)]]</Select>
</Query>
</QueryList>'
$events = Get-WinEvent -FilterXml $q
$i=-1
while ( $i+1 -lt $events.length ) {
if($i -eq -1)
{
[PSCustomObject]@{
StartTime = $events[0].TimeCreated;
StopTime = $null ;
UpTime = [datetime]::Now - $events[0].TimeCreated
}
}
else{
[PSCustomObject]@{
StartTime = $events[$i+1].TimeCreated;
StopTime = $events[$i].TimeCreated ;
UpTime = $events[$i].TimeCreated - $events[$i+1].TimeCreated
}
}
$i += 2
}
}
Get-ComputerUptimeHistory | ft -AutoSize
2. 最近登录失败的详细信息
$xml='<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(EventID=4625)]]</Select>
</Query>
</QueryList>'
$events = Get-WinEvent -FilterXml $xml
$i=0
Write-Host '登录时间','登录账号','登录类型','登录IP地址'
while ($i -lt $events.length) {
$time=$events[$i].TimeCreated
$type=[regex]::matches($events[$i].Message, '登录类型:(.+)') | %{$_.Groups[1].Value.Trim()}
$user=([regex]::matches($events[$i].Message, '帐户名:(.+)') | %{$_.Groups[1].Value.Trim()})[1]
$IP=[regex]::matches($events[$i].Message, '源网络地址:(.+)') | %{$_.Groups[1].Value.Trim()}
Write-Host $time,$user,$type,$IP
$i++
}
登录类型参考如下:
3. 统计指定时间至今的事件数量
# 汇总显示
Get-EventLog security -InstanceId 4624,4625 -After '2020/06/01 00:00' | Group-Object InstanceId | Sort-Object Count -Descending
# 明细显示
Get-EventLog security -InstanceId 4625 -After '2020/06/01 00:00' | Format-List
4. 只关注指定时间某一类型日志
Get-EventLog application -After '2020/06/01 00:00' | Where-Object { $_.EntryType -eq "Error" }