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

PowerShell多行模式匹配:安全组成员移除事件解析

用PowerShell多行模式解析安全事件消息

没问题,我来给你演示怎么用PowerShell的多行正则匹配来解析这条安全事件消息。这类多行结构化日志用多行正则模式提取字段特别方便,咱们一步步来:

核心思路:启用多行正则模式

PowerShell里的正则默认是单行模式,也就是^和$只匹配整个字符串的开头和结尾。要处理多行文本,得用(?m)修饰符启用多行模式,这样^和$就能匹配每行的开头和结尾,精准定位每个字段行。

完整实现代码

直接上可运行的代码,你可以复制到PowerShell里测试:

$EvtMessage= @"
一个成员从安全启用的全局组中被移除。
主体:
安全ID: S-1-5-21-1232435678-3215674231-8564287451-324516
账户名: tstact.ntt.admin
账户域: DT
登录ID: 0x1E3363AEE
成员:
安全ID: S-1-5-21-1523435678-3215674231-8564287451-324516
账户名: CN=DT DEST02,OU=NoStandard,OU=Users,OU=My Org B2B TEST,DC=DT,DC=ad,DC=local
组:
安全ID: S-1-5-21-1523435678-3215674231-8564287451-324516
组名: TSK-DT-S-D-SRVAdmin
组域: DT...
"@

# 定义多行模式的正则表达式,用多行字符串写更清晰
$regex = @'
(?m)
^主体:\r?\n
^安全ID: (.*)\r?\n
^账户名: (.*)\r?\n
^账户域: (.*)\r?\n
^登录ID: (.*)\r?\n
^成员:\r?\n
^安全ID: (.*)\r?\n
^账户名: (.*)\r?\n
^组:\r?\n
^安全ID: (.*)\r?\n
^组名: (.*)\r?\n
^组域: (.*)
'@

# 执行正则匹配
$match = [regex]::Match($EvtMessage, $regex)

if ($match.Success) {
    # 把提取到的字段封装成结构化对象,方便后续处理
    $parsedResult = [PSCustomObject]@{
        事件描述 = "一个成员从安全启用的全局组中被移除。"
        主体 = [PSCustomObject]@{
            安全ID = $match.Groups[1].Value
            账户名 = $match.Groups[2].Value
            账户域 = $match.Groups[3].Value
            登录ID = $match.Groups[4].Value
        }
        成员 = [PSCustomObject]@{
            安全ID = $match.Groups[5].Value
            账户名 = $match.Groups[6].Value
        }
        组 = [PSCustomObject]@{
            安全ID = $match.Groups[7].Value
            组名 = $match.Groups[8].Value
            组域 = $match.Groups[9].Value
        }
    }

    # 格式化输出结果
    $parsedResult | Format-List
} else {
    Write-Host "未匹配到任何内容,请检查消息格式或正则表达式"
}

代码关键部分解释

  1. 多行模式启用:(?m)放在正则开头,开启多行匹配模式,让^精准匹配每行的起始位置。
  2. 换行兼容:用\r?\n匹配换行符,同时兼容Windows(\r\n)和类Unix(\n)的换行格式,避免因为系统差异导致匹配失败。
  3. 捕获组提取:每个(.*)是一个捕获组,用来提取对应字段的内容,之后通过$match.Groups[N].Value获取(N从1开始,对应正则里捕获组的顺序)。
  4. 结构化输出:把提取到的字段封装成PSCustomObject,这样后续可以方便地筛选、导出或者进一步处理。

注意事项

  • 如果你的安全事件消息格式有细微变化(比如字段顺序调整、出现多余空行),可以调整正则:比如用\s*匹配任意空白字符,或者用非贪婪匹配.*?避免过度匹配。
  • 要是需要批量处理多个这类事件,可以把代码改成循环遍历消息列表,重复执行匹配逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:31:33