Python による Microsoft Graph API を利用し、グループのメールアドレスからそのGroup-IDを取得し、そこからグループメンバーのUser-IDを取得してみました

## 概要
Microsoft Graph API を利用してAzureActiveDirectoryから指定したグループ情報（今回はグループメールアドレス）を取得し、そこからそのグループメンバーのUser-IDを取得するための Python プログラムです。
Access Token の取得については、[このプログラム](https://qiita.com/turupon/items/038b893712433ed23f0b) を使用しています。

## 実行環境
macOS Big Sur 11.1 
python 3.8.3

## 実行プログラム

```python:GetAzureGroupMember.py

import json
import requests
import argparse
import time
import pprint
from datetime import datetime, timedelta, date
from collections import OrderedDict
from GetAzureAccessToken import get_azure_access_token  # Azureアクセスのためのアクセストークンの取得オリジナル関数

# メンバーを取得したいグループのメールアドレス
GROUP_ADDRESS_LIST = [
    'tech-gp1@hogehoge.local',
    'tech-gp2@hogehoge.local'
]


# グループに所属するUser情報（id, displayName）の取得
def get_user_from_group(access_token):

    # グループIDの取得
    groupid = OrderedDict()
    groupmember = OrderedDict()
    for num, dept in enumerate(GROUP_ADDRESS_LIST):
        gid = get_group_id(access_token, num, dept)
        groupid[dept] = gid

        # グループメンバーの取得
        gmember = get_group_member(access_token, num, dept, gid)
        groupmember[dept] = gmember
    
    # pprint.pprint(groupmember)
    # print(groupid)
    return groupid, groupmember


# グループメールアドレス毎でのユーザ情報の抽出
def get_group_id(access_token, num, dept) -> str:

    # Microsoft Graphを実行するためのヘッダ情報
    headers = {
        'Authorization': 'Bearer %s' % access_token
    }

	# グループの id, ddisplayName, mail の取得のURL
    GroupsGet_URL = "https://graph.microsoft.com/v1.0/groups?$filter=mail eq '" + \
                    dept + "'&$select=id,displayName"
    print(GroupsGet_URL)

    # グループ情報取得のGetリクエスト
    res1 = requests.get(
        GroupsGet_URL,
        headers=headers
    )
    # requrest処理をクローズする
    res1.close

    # res1をjsonファイルに整形しグループID情報の取得
    try :
        print(res1.json()['value'])
        return res1.json()['value'][0]['id']
    except KeyError :
        print(res1)


# グループメールアドレス毎でのユーザ情報の抽出
def get_group_member(access_token, num, dept, gid):

    # Microsoft Graphを実行するためのヘッダ情報
    headers = {
        'Authorization': 'Bearer %s' % access_token
    }

	# グループメンバーの id, ddisplayName, mail の取得のURL
    MemberGet_URL = "https://graph.microsoft.com/v1.0/groups/{" + \
                    gid + "}/members?$count=true&$select=id,displayName,mail"    
    print(MemberGet_URL)

    # 全Users情報取得のGetリクエスト
    res1 = requests.get(
        MemberGet_URL,
        headers=headers
    )
    # requrest処理をクローズする
    res1.close

    # res1をjsonファイルに整形しグループメンバー情報の取得
    return res1.json()['value']



if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='グループのメールアドレスからそのGroup-IDを取得し、そこからグループメンバーのUser-IDを取得する')
    args = parser.parse_args()

    start = time.time()
    access_token = get_azure_access_token()
    groupid, groupmember = get_user_from_group(access_token)
    get_time = time.time() - start

    print("")
    pprint.pprint(groupid)
    print("")
    pprint.pprint(groupmember)
    print("")
    print("取得時間:{0}".format(get_time) + " [sec]")
    print("")
```

## プログラムの実行
 
最初にヘルプを表示してみます。

```
$ python GetAzureGroupMember.py -h
usage: GetAzureGroupMember.py [-h]

グループのメールアドレスからそのGroup-IDを取得し、そこからグループメンバーのUser-IDを取得する

optional arguments:
  -h, --help  show this help message and exit
```


では、グループに所属するメンバー（ユーザ）の情報を取得してみます。
取得する情報は displayName, id, mail となます。
プログラム中の print文/pprint文を参照に以下の結果を確認ください。

```
$ python GetAzureGroupMember.py
https://graph.microsoft.com/v1.0/groups?$filter=mail eq 'tech-gp1@hogehoge.local'&$select=id,displayName
[{'id': 'aaaaaaaa-5798-4bcc-9c29-bbbbbbbbbbbb', 'displayName': '04_技術本部/Group1'}]
https://graph.microsoft.com/v1.0/groups/{aaaaaaaa-5798-4bcc-9c29-bbbbbbbbbbbb}/members?$count=true&$select=id,displayName,mail
https://graph.microsoft.com/v1.0/groups?$filter=mail eq 'tech-gp2@hogehoge.local'&$select=id,displayName
[{'id': 'eeeeeeee-45e3-4985-add1-cccccccccccc', 'displayName': '04_技術本部/Group2'}]
https://graph.microsoft.com/v1.0/groups/{eeeeeeee-45e3-4985-add1-cccccccccccc}/members?$count=true&$select=id,displayName,mail

OrderedDict([('tech-gp1@hogehoge.local',
              'aaaaaaaa-5798-4bcc-9c29-bbbbbbbbbbbb'),
             ('tech-gp2@hogehoge.local',
              'eeeeeeee-45e3-4985-add1-cccccccccccc')])

OrderedDict([('tech-gp1@hogehoge.local',
              [{'@odata.type': '#microsoft.graph.user',
                'displayName': 'Satoh Koichi',
                'id': '7f7f7f7f-9c7a-48f6-bea4-2a2a2a2a2a2a',
                'mail': 'satoh@hogehoge.local'},
                         ：
                        中略
                         ：
               {'@odata.type': '#microsoft.graph.user',
                'displayName': 'Mikuni Rentaro',
                'id': '3a3a3a3a-4b0c-43d2-8361-d4d4d4d4d4d4',
                'mail': 'mikuni@hogehoge.local'}]),
             ('tech-gp2@hogehoge.local',
              [{'@odata.type': '#microsoft.graph.user',
                'displayName': 'Yamada Taro',
                'id': 'c2c2c2c2-6038-4516-9d80-4f4f4f4f4f4f',
                'mail': 'yamada@hogehoge.local'},
                         ：
                        中略
                         ：
               {'@odata.type': '#microsoft.graph.user',
                'displayName': 'Suzuki Ichiro',
                'id': '8a8a8a8a-181b-48e0-85dc-2c2c2c2c2c2c',
                'mail': 'suzuki@hogehoge.local'}])])

取得時間:0.9662401676177979 [sec]
```

## 参考情報
以下の情報を参考にさせていただきました。感謝申し上げます。
[Azure AD ユーザーアカウントの棚卸しに便利なスクリプト](https://qiita.com/tetsuya-ooooo/items/02e66dd35a102792402c)
[Microsoft Graph を使ってみよう : Graph エクスプローラー](https://qiita.com/kenakamu/items/17905fe66345b8e3754b)