我正在处理从XML转储导入的PowerShell审核日志。
每行都是一个PowerShell事件,包括各个字段,例如:
Attribute:Cmdlet
(已执行的命令的名称)Attribute:Caller
(执行命令的管理员的用户名)CmdletParameters.Parameter
(为命令提供的输入参数)从屏幕快照中可以看到,CmdletParameters.Parameter
是一个表列。
这是我要扩展的列。
每个PowerShell事件可以具有无限数量的参数。
(此数据集中的最大值是单个事件的17个参数。)
例如,这是一个带有两个参数的命令:
Set-Mailbox -Identity Username1 -AccountDisabled FALSE
在此示例中,在CmdletParameters.Parameter
表列中,将有两行:
我想创建两个名为ParameterNames
和ParameterValues
的自定义列
在此示例中,这些自定义列将包含以下文本:
编辑:
评论者要求提供原始XML数据的示例。
我添加了两个事件行,并删除了私人信息。
<?xml version="1.0" encoding="utf-16"?>
<SearchResults>
<Event Caller="AdminUser1" Cmdlet="New-AdminAuditLogSearch" RunDate="2019-04-04T21:49:52+00:00" Succeeded="true" ObjectModified="ObjectUUID1" ExternalAccess="false" OriginatingServer="ServerName1 (IPAddress1)" ClientIP="[IPAddress2]:Port2">
<CmdletParameters>
<Parameter Name="StartDate" Value="4/3/2019 12:00:00 AM" />
<Parameter Name="EndDate" Value="4/4/2019 12:00:00 AM" />
<Parameter Name="ExternalAccess" Value="True" />
<Parameter Name="StatusMailRecipients" Value="AdminUser1" />
<Parameter Name="Name" Value="External admin audit log" />
</CmdletParameters>
</Event>
<Event Caller="AdminUser2" Cmdlet="New-AdminAuditLogSearch" RunDate="2019-04-04T21:33:08+00:00" Succeeded="true" ObjectModified="ObjectUUID2" ExternalAccess="false" OriginatingServer="ServerName2 (IPAddress3)" SessionId="ObjectUUID3" ClientIP="[IPAddress4]:Port4">
<CmdletParameters>
<Parameter Name="StartDate" Value="4/3/2019 12:00:00 AM" />
<Parameter Name="EndDate" Value="4/4/2019 12:00:00 AM" />
<Parameter Name="StatusMailRecipients" Value="AdminUser2" />
</CmdletParameters>
</Event>
</SearchResults>
额外奖金:
如上所述,该数据集中每行最多有17个参数。
如果我还要为ParameterName1..ParameterName17
创建17列,如何填充这些列?
首先将表格列转换为单个文本列,然后将该文本解析为单独的列是否更容易?
答案 0 :(得分:1)
如果第3张图像是所需的输出,则可以通过在自定义列中使用Text.Combine
来实现。
下面是您需要添加2列的“查询”步骤
Add_Parameter_Names= Table.AddColumn(#"Previous Step", "ParameterNames", each Text.Combine([CmdletParameters.Parameter][Attribute:Name], ", "))
Add_Parameter_Values = Table.AddColumn(#"Add_Parameter_Names", "ParameterValues", each Text.Combine([CmdletParameters.Parameter][Attribute:Value], ", "))
注意:如果您在Attribute:Name / Attribute:Value列中有null
个值,建议您添加一个条件列。
关于奖金问题,我认为一旦检查了此输出,您就可以自己决定。如有需要,请发表评论。
答案 1 :(得分:0)
我认为,最好的选择是将这些参数表扩展到新行,然后在Attribute:Name
列上进行旋转。
您应该可以通过单击GUI中的按钮来执行此操作,但这是M代码的样子:
let
XMLTable = <XML Table Here>,
#"Expanded CmdletParameters" = Table.ExpandTableColumn(XMLTable, "CmdletParameters", {"Parameter"}, {"Parameter"}),
#"Expanded Parameter" = Table.ExpandTableColumn(#"Expanded CmdletParameters", "Parameter", {"Attribute:Name", "Attribute:Value"}, {"Attribute:Name", "Attribute:Value"}),
#"Pivoted Column" = Table.Pivot(#"Expanded Parameter", List.Distinct(#"Expanded Parameter"[#"Attribute:Name"]), "Attribute:Name", "Attribute:Value")
in
#"Pivoted Column"
请注意,在转到Attribute:Name
时,我为“值”列选择Attribute:Value
,并在“高级”选项下选择“不进行汇总”。
最终结果应如下所示(除了为可见起见,我删除了其他一些Attribute:
列。