You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:22:12