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

如何使用PowerShell从事件查看器日志提取登录失败的用户名

安全日志4625事件登录失败用户名提取解决方案

最优方案:直接读取事件结构化属性(无需解析文本)

更推荐优先使用这个方案,不会因为日志语言、空格变化导致匹配失败,效率和准确率远高于文本解析
Windows安全事件本身自带结构化属性,不需要手动解析Message文本,4625事件的登录失败用户名存储在事件Properties数组的第5位(索引从0开始计数):

# 拉取目标服务器所有ID为4625的安全审计事件
$logonFailEvents = Get-WinEvent @{LogName='Security';ProviderName='Microsoft-Windows-Security-Auditing';ID=4625 }  -ComputerName SECRETSERVER

# 提取所有登录失败用户名,自动去重后存入数组
$failedAccountList = $logonFailEvents | ForEach-Object { $_.Properties[5].Value } | Select-Object -Unique

你可以直接输出$failedAccountList查看所有账户名,用$failedAccountList.Count验证提取到的账户总数。


备选方案:正则解析Message文本

如果必须从Message文本中提取,原代码的问题是-match默认只返回第一个匹配结果,且没有限定匹配范围,容易命中事件中其他位置的Account Name字段。修正后的代码会先定位到「登录失败账户」区块再全局匹配所有结果:

# 拉取所有4625事件的Message字段内容
$allMessageContent = Get-WinEvent @{LogName='Security';ProviderName='Microsoft-Windows-Security-Auditing';ID=4625 }  -ComputerName SECRETSERVER | Select-Object -ExpandProperty Message

# 全局匹配所有登录失败区块下的账户名
$matchResults = $allMessageContent | Select-String -Pattern 'Account For Which Logon Failed:[\s\S]+?Account Name:\s+(?<AccountName>\S+)' -AllMatches

# 提取账户名去重后存入数组
$failedAccountList = $matchResults.Matches | ForEach-Object { $_.Groups['AccountName'].Value } | Select-Object -Unique

内容的提问来源于stack exchange,提问作者Salve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:36:00