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

如何用JavaScript提取Windows日志中第二次出现的Account Name值

问题原因

Windows 4624登录成功事件中,Account Name字段会在Subject(登录发起主体)、New Logon(新创建的登录会话)两个段落各出现一次。你当前的遍历逻辑没有区分字段所属段落,全局匹配字段时会优先拿到Subject段的机器账号SERVER$,无法获取目标用户名。
如果靠“取第二次匹配结果”的硬编码方式容错性极差,一旦事件版本调整、段落顺序变化就会抓取失败。

修复方案

新增段落状态标记,遍历日志行时先判断当前所处段落,仅当进入New Logon段落之后再捕获Account Name字段值,即可稳定拿到真实登录用户名,修改后完整代码如下:

var lines = value.split("\n");
var accountName = "";
var loginType = "";
var sourceIp = "";
var isInNewLogonBlock = false;

lines.forEach(function(line) {
  var trimmed = line.trim();
  // 识别段落边界,更新状态标记
  if (trimmed === "New Logon:") {
    isInNewLogonBlock = true;
  } else if (trimmed.endsWith(":") && trimmed.indexOf("    ") !== 0) {
    // 匹配到其他一级段落(无前置缩进、冒号结尾),退出New Logon标记状态
    isInNewLogonBlock = false;
  }

  // 提取登录类型
  if (trimmed.substring(0, 11) === "Logon Type:") {
    loginType = line.substring(12).trim();
  }
  // 仅在New Logon段落内提取账号名
  if (isInNewLogonBlock && trimmed.substring(0, 13) === "Account Name:") {
    accountName = line.substring(14).trim();
  }
  // 提取源IP
  if (trimmed.substring(0, 23) === "Source Network Address:") {
    sourceIp = line.substring(24).trim();
  }
});
return loginType + " " + accountName + " " + sourceIp;
方案说明
  • 该逻辑完全适配Windows安全事件日志的格式规范:所有一级段落标题均为行首无缩进、以冒号结尾的格式,字段行均带前置缩进,段落识别准确率高
  • 不受前置段落同名字段数量影响,哪怕后续日志版本新增其他带Account Name字段的段落,也不会出现误抓取问题
  • 不建议使用“匹配计数取第二个值”的方案,该方案无任何容错能力,日志结构微小变动就会导致解析失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:06:21