系统极客一直在努力
专注于操作系统及软件使用教程

万能的PowerShell:筛选Windows事件日志中的关机事件

PowerShell

在对系统进行日志分析和审核时,系统管理员经常都需要手动去筛选并统计出 Windows 的关机事件。以前我一直都是直接在事件查看器中进行手动筛选,如果你要管理的服务器很多,手动操作起来会十分麻烦并低效率。所以想起了用 PowerShell 的 Get-EventLog cmdlet 来自动筛选 Windows 事件日志中的关机事件。

使用Get-EventLog cmdlet超简单

Windows 中提供了 2 个分析事件日志的 PowerShell cmdlet:一个是Get-WinEvent,超级强大,但使用起来比较麻烦;另一个是Get-EventLog,使得起来相当简单,可以实时筛选。今天我们就来细说一下Get-EventLog的简单用法。

从 Windows XP 和 Windows Server 2003 开始,Windows 中便有了关机事件跟踪程序,它可以跟踪 Windows 操作系统的关机事件并将其写入到来源为 USER32 的系统日志当中。因此,我们便可以直接使用 Get-EventLog cmdlet 到系统日志中搜索这样的信息:

Get-EventLog -LogName system -Source user32

use-powershell-parse-shutdown-events-2

通常对于管理员或用户来说,关机事件也是有 2 种的,即:正常关机和非正常关机事件。通常我们都仅关心如蓝屏、掉电等引起的非正常关机事件。

在关机事件的筛选上,我们可以使用如下命令按 EventID 将事件进行分组:

Get-EventLog -LogName system -Source user32 | group EventID

use-powershell-parse-shutdown-events-3

从上图中可以看到,我们目前仅有 EventID: 1074 的事件共 25 次。

如果你想查看关机事件的详细信息,我们可以将其丢到 Format-List cmdlet 来格式化输出。(fl 是 Format-List 的别名)

Get-EventLog -LogName system -Source user32 -Newest 1 | fl *

use-powershell-parse-shutdown-events-4

详细信息的输出包括:机器名、事件生成时间、用户名、消息等一条串内容,对于这些信息我们可以挑有用的进行选择性输出。例如,我们只对关机事件的生成时间(TimeGenerated)和消息(Message)感兴趣,就可以这样来输出。

Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message

use-powershell-parse-shutdown-events-5

从上图中我们可以看到关机事件的排序是按时间顺序进行排列的,如果你希望按关机事件的发起进程分类排序可以这样写:

Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message | sort message

use-powershell-parse-shutdown-events-6

这样看起来就好一点了,不过 Message 列的输出太长,我们再来整理下:

Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message | sort message | ft -Wrap

use-powershell-parse-shutdown-events-7

到这里大家对使用 PowerShell 的 Get-EventLog cmdlet 来筛选 Windows 事件日志中的关机事件应该有个初步了解了,使用起来是不是非常简单。使用 PowerShell 的远程管理等特性,就可以批量在服务器上执行信息收集,非常方便。

分享到:更多 ()