9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Office 365 監査ログを Excel で簡単に整形するには

Last updated at Posted at 2017-11-05

Power BI Desktop や Excel のクエリ エディター では JSON形式で記述されたデータの解析が簡単にできるようになっています。ここでは Office 365 監査ログ(csv)を 手早くExcel テーブルに変換してみます。ポイントは JSON形式の AuditData 列 をパースすることです。また、Office 365 監査ログの AuditData 列は、提供されているサービスごとで取得できるフィールド(列)は異なります。なので、ログを取得したいサービス別にエクスポートすることは解決策をシンプルにする方法ではありますが、依然、AuditData 列から必要な値を参照するための "列の分割" では困難というかスマートではないなぁと思うのです。

第20回 Office 365 勉強会 のLTでちょっとだけ触れましたがその補足です。

Office 365 監査ログ

監査ログを参照できるユーザーは限られるのでその設などの解説はしない。

Office 365 監査ログを Excel テーブルとして読み込む

まずは インポート

20171105 (1).png
1 - 該当のログファイル(csv) をインポートする。
2 - Unicodeであることなど自動で認識されるが異なるようなら調整する。[編集]でクエリ エディターに。

AuditData 列の解析

20171105 (2).png
3 - AuditData 列を選択
4 - [解析] → [JSON]

20171105 (3).png

解析済みの AuditData 列から参照

20171105 (4).png
5 - [カスタム列] の追加
6 - "新しい列名"と"カスタム列の式" を設定。式は "= [AuditData][Workload]"

20171105 (5).png
AuditData 列から フィールド Workload の値が抽出できた。同じ手順で フィールド ResultStatus を 抽出.

20171105 (6).png
7 - 同じ手順で ResultStatus を抽出。式は "= [AuditData][ResultStatus]"

20171105 (7).png
AuditData に フィールド ResultStatus が存在しない場合は Error となるので、
8 - 式を "= [AuditData][Workload]?" に修正

20171105 (8).png
20171105 (9).png
フィールド アクセスの "[]" に "?" を付けると、フィールドが存在する場合は該当の値を、フィールドが存在しない場合 null を返す。

20171105 (10).png
9 - AuditData 列を選択
10 - 列を削除

Excel テーブルにロード

20171105 (11).png
11 - クエリ エディターを [閉じて読み込む]

複数値を持つフィールドの参照

20171105 (12).png
JSON にパースしたところから始めてみる。

20171105 (13).png
RecordType が 15 であるものを対象とするフィルターを適用

20171105 (14).png
ExtendedProperties 列を [カスタム列]の追加で抽出
それぞれの値は record の list であることが確認できる。そして その要素数が異なる。

20171105 (15).png
record 型の値リストは table に変換
Name - Value の組合せを表すテーブルになる

20171105 (16).png
行と列を入れ替え、

20171105 (17).png
1行目を列名に

20171105 (18).png
必ず1行のテーブルになるので record に変換する。これでフィールド値を参照しやすくなる。

let
    FullName = "hogehoge\AuditLog_0000-00-00_0000-00-00.csv",
    Source = Csv.Document(
        File.Contents(FullName),
        [Delimiter=",", Columns=4, Encoding=65001, QuoteStyle=QuoteStyle.None]
    ),
    #"Promoted Headers" = Table.PromoteHeaders(
        Source,
        [PromoteAllScalars=true]
    ),
    #"Changed Type" = Table.TransformColumnTypes(
        #"Promoted Headers",
        {
            {"CreationDate", type datetime}
          , {"UserIds", type text}
          , {"Operations", type text}
          , {"AuditData", type text}
        }
    ),
    #"Parsed JSON" = Table.TransformColumns(
        #"Changed Type"
      , {
            {"AuditData", Json.Document}
        }
    ),
    Custom1 = Table.SelectRows(
        #"Parsed JSON"
      , each [AuditData][RecordType] = 15
    ),
    Custom2 = Table.AddColumn(
        Custom1
      , "ExtendedProperties"
      , each [AuditData][ExtendedProperties]
    ),
    Custom3 = Table.TransformColumns(
        Custom2
      , {"ExtendedProperties", each Table.FromRecords(_)}
    ),
    Custom4 = Table.TransformColumns(
        Custom3
      , {"ExtendedProperties", each Table.Transpose(_)}
    ),
    Custom5 = Table.TransformColumns(
        Custom4
      , {"ExtendedProperties", each Table.PromoteHeaders(_)}
    ),
    Custom6 = Table.TransformColumns(
        Custom5
      , {"ExtendedProperties", each _{0}}
    )
in
    Custom6

20171105 (19).png

table 型の値は 列の展開ができるのだけど、この場合は 監査ログに存在するプロパティのみとなるので用途に合わせて使えばよい。

情報

その他

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?