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

如何用PowerShell获取服务器成功登录记录(含TimeGenerated、UserName)

问题分析与修复方案

你的脚本存在两个核心问题:

  1. Split语法逻辑错误:
    你写的-split "rn"[1] 写法有误,正确的逻辑应该是先完成拆分操作,再取结果数组的索引,也就是(-split "rn")[1]。原写法会先提取字符串"rn"的第一个字符(\r)作为分隔符,再返回整个拆分后的数组,完全取不到你需要的用户名内容。

  2. 依赖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:22:34