如何解析Get-WinEvent获取的事件ID10036日志提取用户名与IP地址
Windows系统日志10036事件字段提取方案
直接运行以下PowerShell脚本即可输出要求的分号分隔结构化结果,优先读取事件原生结构化属性,比纯文本正则解析稳定性更高,兼容不同Windows版本、中英文系统环境:
# 输出表头 "User;Address" Get-WinEvent -FilterHashtable @{LogName='System';ID='10036'} -MaxEvents 5 | ForEach-Object { # 加载事件XML结构化数据 $eventXml = [xml]$_.ToXml() $nsMgr = New-Object System.Xml.XmlNamespaceManager($eventXml.NameTable) $nsMgr.AddNamespace("ev", "http://schemas.microsoft.com/win/2004/08/events/event") # 提取对应结构化字段:第6个Data节点为用户名,第9个Data节点为源IP $user = $eventXml.SelectSingleNode("//ev:EventData/ev:Data[6]", $nsMgr).InnerText $address = $eventXml.SelectSingleNode("//ev:EventData/ev:Data[9]", $nsMgr).InnerText # 兜底:结构化字段提取失败时,用正则匹配消息正文 if (-not $user -or -not $address) { if ($_.Message -match '用户\s*(?<user>\S+)\s*.*?源地址\s*(?<addr>(\d{1,3}\.){3}\d{1,3}|[0-9a-fA-F:]+)') { $user = $matches.user $address = $matches.addr } } "$user;$address" }
说明
- 脚本默认查询最近5条符合条件的事件,可修改
-MaxEvents后的数值调整查询条数,移除该参数则查询全量历史10036事件 - 内置兜底正则同时支持IPv4、IPv6地址识别,适配中文系统默认事件文案
- 若使用英文系统,只需将正则里的
用户替换为user、源地址替换为source address即可正常匹配
输出示例
User;Address CONTOSO\wangwu;192.168.3.42 CORP\zhaoliu;10.0.12.87 LOCAL\admin;172.16.5.2
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

