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

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

[第20回 Office 365 勉強会](jpo365ug.com/o365-meeting/meeting-20/) のLTでちょっとだけ触れましたがその補足です。

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

- [監査ログを検索し、Office 365 でのユーザーと管理者のアクティビティを確認する - Office 365](https://support.office.com/ja-jp/article/%E7%9B%A3%E6%9F%BB%E3%83%AD%E3%82%B0%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%97%E3%80%81Office-365-%E3%81%A7%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A8%E7%AE%A1%E7%90%86%E8%80%85%E3%81%AE%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B-57ca5138-0ae0-4d34-bd40-240441ef2fb6)
- [Office 365 のセキュリティ センターとコンプライアンス センターで監査ログを検索する  Office サポート](https://support.office.com/ja-jp/article/Office-365-のセキュリティ-センターとコンプライアンス-センターで監査ログを検索する-0d4d0f35-390b-4518-800e-0c7ec95e946c)
- [Office 365 監査ログの詳細なプロパティ- Office 365](https://support.office.com/ja-jp/article/Office-365-%E7%9B%A3%E6%9F%BB%E3%83%AD%E3%82%B0%E3%81%AE%E8%A9%B3%E7%B4%B0%E3%81%AA%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3-ce004100-9e7f-443e-942b-9b04098fcfc3)

# Office 365 監査ログを Excel テーブルとして読み込む
## まずは インポート
![20171105 (1).png](https://qiita-image-store.s3.amazonaws.com/0/193509/c1f2e5cc-bcf8-c33c-1965-91fd50a21875.png)
1 - 該当のログファイル(csv) をインポートする。
2 - Unicodeであることなど自動で認識されるが異なるようなら調整する。[編集]でクエリ エディターに。 
## AuditData 列の解析
![20171105 (2).png](https://qiita-image-store.s3.amazonaws.com/0/193509/63af19da-a4ae-c9c3-29d7-022dbad566fe.png)
3 - AuditData 列を選択
4 - [解析] → [JSON]

![20171105 (3).png](https://qiita-image-store.s3.amazonaws.com/0/193509/25295572-f8fb-8f6b-aa16-afcc585b6128.png)
## 解析済みの AuditData 列から参照
![20171105 (4).png](https://qiita-image-store.s3.amazonaws.com/0/193509/f6fff793-e6ae-bdea-6d98-47a1673b317f.png)
5 - [カスタム列] の追加
6 - "新しい列名"と"カスタム列の式" を設定。式は "= [AuditData][Workload]"

![20171105 (5).png](https://qiita-image-store.s3.amazonaws.com/0/193509/602a9e6e-612e-9b75-a47d-0e059a0e280f.png)
AuditData 列から フィールド Workload の値が抽出できた。同じ手順で フィールド ResultStatus を 抽出.


![20171105 (6).png](https://qiita-image-store.s3.amazonaws.com/0/193509/ee48251e-8cc3-d16a-9c69-da989bffa8b5.png)
7 - 同じ手順で ResultStatus を抽出。式は "= [AuditData][ResultStatus]"

![20171105 (7).png](https://qiita-image-store.s3.amazonaws.com/0/193509/3f829ebd-65d9-f1fb-1f34-7600706a7333.png)
AuditData に フィールド ResultStatus が存在しない場合は Error となるので、
8 - 式を "= [AuditData][Workload]?" に修正

![20171105 (8).png](https://qiita-image-store.s3.amazonaws.com/0/193509/aa48742f-8b02-65a6-0d52-0cdcc2164a53.png)
![20171105 (9).png](https://qiita-image-store.s3.amazonaws.com/0/193509/d059b3af-f642-aaaf-dee6-a8ddbe0bb67e.png)
フィールド アクセスの "[]" に "?" を付けると、フィールドが存在する場合は該当の値を、フィールドが存在しない場合 null を返す。

![20171105 (10).png](https://qiita-image-store.s3.amazonaws.com/0/193509/8398e71d-99fd-d9cb-6d30-afe12dbe635e.png)
9 - AuditData 列を選択
10 - 列を削除
## Excel テーブルにロード
![20171105 (11).png](https://qiita-image-store.s3.amazonaws.com/0/193509/eceac762-0745-f09e-b3be-fd51dab12677.png)
11 - クエリ エディターを [閉じて読み込む]

# 複数値を持つフィールドの参照
![20171105 (12).png](https://qiita-image-store.s3.amazonaws.com/0/193509/6407242f-1edd-afd0-de8f-2c7d2e8da9fd.png)
JSON にパースしたところから始めてみる。

![20171105 (13).png](https://qiita-image-store.s3.amazonaws.com/0/193509/5debfc6e-27ba-9cdf-2f66-ed414bc868d4.png)
RecordType が 15 であるものを対象とするフィルターを適用

![20171105 (14).png](https://qiita-image-store.s3.amazonaws.com/0/193509/8198e21c-44cd-5891-d01a-4108b5667f8e.png)
ExtendedProperties 列を [カスタム列]の追加で抽出
それぞれの値は record の list であることが確認できる。そして その要素数が異なる。

![20171105 (15).png](https://qiita-image-store.s3.amazonaws.com/0/193509/03dbc4f9-0701-9599-9858-35bf60a3035d.png)
record 型の値リストは table に変換
Name - Value の組合せを表すテーブルになる

![20171105 (16).png](https://qiita-image-store.s3.amazonaws.com/0/193509/371a0afe-4bdf-acc2-6c2e-68b77243ede3.png)
行と列を入れ替え、

![20171105 (17).png](https://qiita-image-store.s3.amazonaws.com/0/193509/61e50a6e-ec68-0ba9-f645-64abbf2e16ca.png)
1行目を列名に

![20171105 (18).png](https://qiita-image-store.s3.amazonaws.com/0/193509/d0461963-4eeb-13f7-1364-4e2c0f033e6d.png)
必ず1行のテーブルになるので record に変換する。これでフィールド値を参照しやすくなる。

```text
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](https://qiita-image-store.s3.amazonaws.com/0/193509/a67e1467-0e7a-fe5b-afdd-4987dc0d39a7.png)

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

# 情報
- [Office 365 Management Activity API schema | MSDN](https://msdn.microsoft.com/office-365/office-365-management-activity-api-schema)

# その他
- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)
- [Japan Office365 Users Group](http://jpo365ug.com/)