如何为Get-WinEvent输出的Properties匹配系统日志中的属性名称?
让Terminal Services Gateway日志属性显示对应系统名称的方法
你执行了以下PowerShell命令导出Terminal Services Gateway的操作日志:
Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-Gateway/Operational'; Id=307,302,303; StartTime='01.11.2022 0:00:01'} | Select-Object TimeCreated, ID, Message, Properties | Format-Table -AutoSize | Export-Clixml xml.xml
但导出的XML里Properties字段仅显示无命名的Value,示例如下:
<Obj RefId="19"> <TNRef RefId="2" /> <ToString>System.Diagnostics.Eventing.Reader.EventProperty</ToString> <Props> <S N="Value">6280</S> </Props> </Obj>
想要让这些属性显示系统日志里对应的名称,按下面的方法操作:
解决步骤
问题根源是Get-WinEvent返回的事件对象中,Properties只是无命名的值集合,要拿到系统定义的属性名称,得读取事件的元数据模板,把值和名称配对起来。直接用下面的修改版命令即可:
Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-Gateway/Operational'; Id=307,302,303; StartTime='01.11.2022 0:00:01'} | ForEach-Object { # 生成属性名称与值的映射表 $namedProps = [ordered]@{} for ($i=0; $i -lt $_.Properties.Count; $i++) { # 从事件元数据里拿属性名称 $propName = $_.EventRecordFormat.Properties[$i].Name $namedProps[$propName] = $_.Properties[$i].Value } # 输出包含命名属性的自定义对象 [PSCustomObject]@{ TimeCreated = $_.TimeCreated ID = $_.Id Message = $_.Message NamedProperties = $namedProps } } | Export-Clixml xml_with_named_props.xml
关键说明
$_.EventRecordFormat.Properties里存着系统日志为该事件ID定义的所有属性名称,通过索引遍历就能把Properties里的值和名称一一对应,生成带名称的哈希表。- 别再用
Format-Table了,它会把原始对象转成格式化后的文本对象,破坏属性结构,直接导出自定义对象才能保留完整的命名属性信息。 - 导出的XML里,
NamedProperties会以键值对形式展示每个属性的名称和对应值,和你在系统日志里看到的完全一致。
内容的提问来源于stack exchange,提问作者Andrei Lyashko
相关产品推荐
相关产品推荐

