search
LoginSignup
3

More than 1 year has passed since last update.

posted at

updated at

Organization

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

概要

Microsoft Graph API を利用してAzureActiveDirectoryから指定したグループ情報(今回はグループメールアドレス)を取得し、そこからそのグループメンバーのUser-IDを取得するための Python プログラムです。
Access Token の取得については、このプログラム を使用しています。

実行環境

macOS Big Sur 11.1
python 3.8.3

実行プログラム

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 ユーザーアカウントの棚卸しに便利なスクリプト
Microsoft Graph を使ってみよう : Graph エクスプローラー

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
What you can do with signing up
3