PowerShell技术问询:如何读取事件查看器中Event ID 1085的EventData节点下DCName字段
解决读取Event ID 1085中EventData节点下DCName字段的问题
我来帮你搞定这个读取事件查看器EventData的问题!你现在能读取System部分但拿不到EventData里的DCName,核心原因是EventData下的字段并不是直接以节点名称存在的——它们都被包裹在<Data>节点里,通过Name属性来区分不同字段,比如DCName就是其中一个<Data Name="DCName">节点的内容。
为什么你的原代码不生效?
当你尝试$events.EventData.DCName时,PowerShell会去查找EventData节点下名为DCName的直接子节点,但实际上这个节点并不存在,所有数据项都是<Data>元素,所以自然拿不到结果。
两种可行的解决方案
方案1:遍历EventData的Data数组筛选字段
直接遍历每个事件的EventData.Data集合,通过Name属性筛选出DCName对应的节点,然后提取其文本内容:
$filter = @{ LogName = 'System'; ID=1085 } [xml[]]$xml = Get-WinEvent -filterHashTable $filter -MaxEvents 10 -ComputerName SERVER | ForEach-Object { $_.ToXml() } $events = $xml | Select-Xml '//x:Event' -Namespace @{ x = 'http://schemas.microsoft.com/win/2004/08/events/event' } | Select-Object -ExpandProperty Node # 遍历每个事件提取DCName和Computer信息 foreach ($event in $events) { $computerName = $event.System.Computer $dcName = ($event.EventData.Data | Where-Object { $_.Name -eq 'DCName' }).'#text' Write-Host "计算机: $computerName | 域控制器名称: $dcName" }
方案2:使用XPath直接定位目标Data节点
利用XPath表达式精准匹配带有Name="DCName"的Data节点,结合命名空间来查询:
$filter = @{ LogName = 'System'; ID=1085 } [xml[]]$xml = Get-WinEvent -filterHashTable $filter -MaxEvents 10 -ComputerName SERVER | ForEach-Object { $_.ToXml() } $ns = @{ x = 'http://schemas.microsoft.com/win/2004/08/events/event' } $eventsWithDCName = $xml | Select-Xml '//x:Event' -Namespace $ns | ForEach-Object { $eventNode = $_.Node [PSCustomObject]@{ Computer = $eventNode.System.Computer DCName = ($eventNode | Select-Xml '//x:Data[@Name="DCName"]' -Namespace $ns).Node.'#text' } } # 查看结果 $eventsWithDCName
额外提示
你可以先执行$events[0].EventData | Format-List *来查看EventData节点的具体结构,这样能更直观地理解数据的组织方式,方便后续调整查询逻辑。
内容的提问来源于stack exchange,提问作者Jaroslav Stolařík
相关产品推荐
相关产品推荐

