使用Get-WinEvent获取事件4625的FailureReason %%2313遇阻求助
解决Get-WinEvent获取事件ID4625的FailureReason及状态码解析问题
我来帮你搞定这个问题!处理Windows安全事件ID4625(登录失败)的时候,确实经常会遇到XML字段提取和状态码转可读文本的坑,下面给你一步步的解决方案:
1. 正确提取XML中的FailureReason
你之前可能没找对XML节点的路径,4625事件的自定义字段都存在Event.EventData.Data节点下,每个节点都有Name属性来标识字段类型。可以用下面的方法精准提取:
# 先获取目标事件,这里以最近10条4625事件为例 $loginFailEvents = Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} -MaxEvents 10 foreach ($event in $loginFailEvents) { # 将事件转换为XML对象 $eventXml = [xml]$event.ToXml() # 通过Name属性定位FailureReason字段 $failureReason = ($eventXml.Event.EventData.Data | Where-Object { $_.Name -eq 'FailureReason' }).'#text' Write-Host "事件时间: $($event.TimeCreated) | 失败原因: $failureReason" }
2. 解析状态码(比如%%2313)为可读文本
那些%%XXXX格式的状态码其实是Windows系统错误码的占位符,对应的十进制数值可以通过Win32Exception类来解析成可读消息。需要注意的是,4625事件里的Status字段是十六进制格式,得先转成十进制再处理:
# 承接上面的循环,添加状态码解析逻辑 foreach ($event in $loginFailEvents) { $eventXml = [xml]$event.ToXml() # 提取十六进制的Status值 $hexStatus = ($eventXml.Event.EventData.Data | Where-Object { $_.Name -eq 'Status' }).'#text' # 转换为十进制 $decimalStatus = [convert]::ToInt32($hexStatus, 16) # 解析为可读错误消息 $statusMessage = [System.ComponentModel.Win32Exception]$decimalStatus Write-Host "状态码(十六进制): $hexStatus | 可读描述: $($statusMessage.Message)" }
3. 整合为完整的自定义输出脚本
把上面的逻辑结合起来,就能直接输出包含所有你需要的字段的自定义对象,方便导出或进一步处理:
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} -MaxEvents 10 | ForEach-Object { $eventXml = [xml]$_.ToXml() # 提取关键字段 $targetUser = ($eventXml.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' }).'#text' $failureReason = ($eventXml.Event.EventData.Data | Where-Object { $_.Name -eq 'FailureReason' }).'#text' $hexStatus = ($eventXml.Event.EventData.Data | Where-Object { $_.Name -eq 'Status' }).'#text' $decimalStatus = [convert]::ToInt32($hexStatus, 16) $statusMessage = [System.ComponentModel.Win32Exception]$decimalStatus # 输出结构化对象 [PSCustomObject]@{ TimeCreated = $_.TimeCreated TargetUserName = $targetUser FailureReason = $failureReason StatusCodeHex = $hexStatus StatusCodeDecimal = $decimalStatus StatusDescription = $statusMessage.Message } } | Format-Table -AutoSize
这样你就不用手动去填状态信息了,脚本会自动帮你解析所有需要的字段!
内容的提问来源于stack exchange,提问作者Peter Core
相关产品推荐
相关产品推荐

