2

我正在处理一个 PowerShell 审核日志,它是从 XML 转储中导入的。

每行都是一个 PowerShell 事件,包括各种字段,例如:

  • Attribute:Cmdlet(执行的命令的名称)
  • Attribute:Caller(执行命令的管理员的用户名)
  • CmdletParameters.Parameter(为命令提供的输入参数)

在此处输入图像描述

从屏幕截图中可以看出,CmdletParameters.Parameter是一个表格列。
这是我要扩展的专栏。

每个 PowerShell 事件可以有无限数量的参数。
(这个数据集中的最大值是单个事件的 17 个参数。)

例如,这是一个带有两个参数的命令:
Set-Mailbox -Identity Username1 -AccountDisabled FALSE

在此示例中,在CmdletParameters.Parameter表格列中,将有两行:

在此处输入图像描述

我想创建两个名为ParameterNamesandParameterValues
在此示例中的自定义列,这些自定义列将包含文本:

在此处输入图像描述

编辑:
评论者要求提供原始 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 个参数。
如果我还要创建 17 列ParameterName1..ParameterName17,我该如何填充这些列?
首先将表格列转换为单个文本列,然后将该文本解析为单独的列是否更容易?

4

2 回答 2

1

如果您的第三张图像是您想要的输出,您可以通过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], ", "))

注意:如果您null在 Attribute:Name/Attribute:Value 列中有值,我建议添加一个条件列。

至于您的奖金问题,我认为您可以在检查此输出后自行决定。如果您需要任何东西,请发表评论。

于 2019-07-10T15:29:21.723 回答
1

我认为这里最好的选择是将这些参数表扩展到新行,然后以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:列以提高可见性。

枢轴属性

于 2019-04-09T15:37:30.083 回答