如何用PowerShell获取服务器成功登录记录(含TimeGenerated、UserName)
问题分析与修复方案
你的脚本存在两个核心问题:
Split语法逻辑错误:
你写的-split "rn"[1]写法有误,正确的逻辑应该是先完成拆分操作,再取结果数组的索引,也就是(-split "rn")[1]。原写法会先提取字符串"rn"的第一个字符(\r)作为分隔符,再返回整个拆分后的数组,完全取不到你需要的用户名内容。依赖Message字段拆分不可靠:
事件日志的Message字段会随系统语言、Windows版本变化,靠字符串拆分的方法很容易失效。而且Get-EventLog是微软标记为过时的命令,现在推荐使用Get-WinEvent——它能直接访问事件的结构化属性,效率更高、结果更稳定。
修复后的旧版本脚本(仅修正Split问题)
如果暂时不想更换命令,调整Split的写法即可正常运行:
Clear-Host Get-EventLog -LogName Security | Where-Object {$_.EventID -eq 4624} | ForEach-Object { $message = $_.Message # 修正Split的括号位置,同时用Trim()去除多余空格 $userName = (($message -split "Kontoname: ")[1] -split "`r`n")[0].Trim() [PSCustomObject]@{ TimeGenerated = $_.TimeGenerated UserName = $userName } } | Format-Table TimeGenerated, UserName
推荐的最优方案(使用Get-WinEvent)
直接解析事件的结构化属性,彻底避免字符串拆分的不稳定问题:
Clear-Host Get-WinEvent -FilterHashtable @{ LogName = 'Security' ID = 4624 } | ForEach-Object { [PSCustomObject]@{ TimeGenerated = $_.TimeCreated # Windows事件4624的Properties[5]对应用户名(若索引不符,可通过$_.Properties查看所有属性值) UserName = $_.Properties[5].Value } } | Format-Table TimeGenerated, UserName
Get-WinEvent支持更灵活的过滤规则(比如指定时间范围),查询速度也远快于Get-EventLog。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

