如何使用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
相关产品推荐
相关产品推荐

