当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 改善事件日志

作者:精品下载站 日期:2024-12-14 07:56:58 浏览:15 分类:玩电脑

使用 PowerShell 改善事件日志


因为我不在公司环境中工作,所以我并不总能看到 PowerShell 可以让 IT 专业人士的生活变得更好的机会。我有一个朋友——我们就叫她格拉迪斯·克拉维茨吧。 Gladys 和我正在聊天,她提到从 Windows 事件日志中提取信息是多么棘手。如果我记得的话,她正在查看安全日志中的 4625 事件,这些事件代表失败的登录尝试。这是一个例子:

[玩转系统] 使用 PowerShell 改善事件日志

阅读该消息可以清楚地看出,公司域中的用户 Aprils 试图登录 Win10。但是如何从 100 台计算机上的事件日志中获取这些信息呢?您可以使用一些正则表达式巫毒来提取信息。这些值实际上是事件日志记录的一部分。您在使用 Get-Eventlog 时可能已经看到 ReplacementStrings。使用 Get-WinEvent 时,这些值将存储为属性。

[玩转系统] 使用 PowerShell 改善事件日志

假设这些值是一致的,您可以编写一个函数来根据这些值创建自定义对象。但我总是着眼于大局。 Gladys 真正想要的是一种将事件日志记录转换为她可以在 PowerShell 中使用的结构化对象的方法。替换字符串的问题超出了这种特殊情况。

XML 来救援

您可能不认为 XML 是一种解决方案,但在这种情况下,XML 挽救了局面。从 Get-WinEvent 获取的事件日志记录对象包含创建 XML 版本的方法。

 $r = get-winevent -FilterHashtable @{Logname="Security";ID=4625} -MaxEvents 1 -ComputerName Win10 [xml]$evt = $r.ToXml() 

该文档具有公开用于构造事件日志记录的数据的属性。

[玩转系统] 使用 PowerShell 改善事件日志

数据节点看起来很有前途。

[玩转系统] 使用 PowerShell 改善事件日志

那几乎看起来像一个物体!我会做一个。

$evt.Event.EventData.Data | foreach-object -Begin {$h = @{}} -Process {
 $h.add($_.name,$_.'#text')
} -end { $obj = New-Object -TypeName PSObject -Property $h }

[玩转系统] 使用 PowerShell 改善事件日志

我可以围绕此构建一个工具,将事件日志记录转换为更有意义的对象。这正是我为格拉迪斯所做的。

转换事件日志记录

我编写了一个名为 Convert-EventLogRecord 的函数,它是我的 PSScriptTools 模块最新版本的一部分。该函数旨在将事件日志条目转换为自定义对象。该函数创建一个自定义对象,其中包含我显示的数据属性,以及其他信息,例如事件 ID、日志名称和计算机名称。

[玩转系统] 使用 PowerShell 改善事件日志

现在,Gladys 拥有一个 PowerShell 工具,可以以她想要的形式获取她想要的信息。

[玩转系统] 使用 PowerShell 改善事件日志

这不是一个完美的工具。有些甚至日志条目没有额外的数据。或者他们拥有的数据只是一个字符串列表。在这些情况下,数据存储为 RawProperties。

[玩转系统] 使用 PowerShell 改善事件日志

但是一旦我知道我可以编写控制脚本或其他工具。

[玩转系统] 使用 PowerShell 改善事件日志

当您探索不同日志中的不同事件时,您会弄清楚事情是什么样的。有时事件日志数据没有帮助。但只要您在 PowerShell 上做一点努力,就可以创建有意义的结果。您应该能够在桌面上运行此代码。

Get-WinEvent -FilterHashtable @{Logname ='system';ID =7040} -MaxEvent 50 |
Convert-EventlogRecord | 
Sort-Object -Property Param4,TimeCreated -Descending |
Format-Table -GroupBy @{Name="Service";Expression={$_.param4}} -Property TimeCreated,
@{Name="OriginalState";Expression = {$_.param2}},
@{Name="NewState";Expression={$_.param3}},Computername

结果会向您显示服务状态何时发生变化。

[玩转系统] 使用 PowerShell 改善事件日志

我一直将结果显示为格式化表格。但是您可以做任何您想做的事情,因为 Convert-EventLogRecord 函数正在将对象写入管道。运行您想要的任何 Get-Winevent 查询或命令,转换结果,然后对结果执行您需要的操作。

我将代码提供给 Gladys 来试用,但现在您也可以在 PSScriptTools 模块中获取它,从版本 2.13 开始。我希望你能尝试一下并让我知道你的想法。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯