Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
12
Help us understand the problem. What are the problem?

posted at

updated at

Microsoft GraphAPIをつかってみよう。-- 実践 編--

・はじめに

前回は、Microsoft Graph APIを利用するためのアプリ登録手順についてお話ししました。
Microsoft Graph APIをつかってみよう。-- 事前準備 編--

今回は、登録したアプリを使って PowerShell で GraphAPI を利用し、情報取得するまでをご説明します。

・クライアント資格情報による認証

Microsoft Graph にアクセスする際は認証が必要になります。
その認証方法は下記の4パターンです。
 ・デバイスコードによる認証
 ・認証コードによる認証
 ・パスワードによる認証
 ・クライアント資格情報による認証

今回は「クライアント資格情報による認証」に絞って紹介します。

この認証方法は、サインインを必要とせずMicrosoft Graphに対して認証することができます。
実行時にサインインを求められないため「自動化されたタスクやスクリプト」に最適です。

例として「自分の組織のすべてのグループ」を取得するためのサンプルを用意しました。
PowerShellで下記ソースコードを実行すると「自分の組織のすべてのグループ」を取得できます。
※<>内は登録したアプリの情報に修正してください。

・サンプルコード

#######################GraphAPI接続 start
$clientid = "<アプリケーション(クライアント)ID>"
$tenantName = "<アプリを登録したテナントのドメイン> 例(QiitaTest2020.onmicrosoft.com)"
$clientSecret = "<クライアント シークレット>"

$ReqTokenBody = @{
    Grant_Type    = "client_credentials"
    Scope         = "https://graph.microsoft.com/.default"
    client_Id     = $clientID
    Client_Secret = $clientSecret
} 

$TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody
#######################GraphAPI接続 end

#######################GraphAPIで情報取得
$apiUrl = 'https://graph.microsoft.com/v1.0/Groups/'
$Data = Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri $apiUrl -Method Get
$Groups = ($Data | select-object Value ).Value
$Groups | Format-Table DisplayName, Description -AutoSize

解説

アクセストークン取得

前回登録したアプリでアクセストークンを取得します。
アクセストークンには、アプリ自体とアプリに付与されているアクセス許可に関する情報が含まれており、このアクセストークンを取得してGraph APIを利用可能にし、Microsoft Graphにアクセスして情報を取得します。

2行目~13行目でアクセストークンを取得します。
 2行目:Azure ADで登録したアプリの「アプリケーション(クライアント)ID」を入力します。
 3行目:「アプリを登録したテナントのドメイン」を入力します。
 4行目:Azure ADで登録したアプリの「クライアント シークレット」を入力します。
 ※今回クライアント シークレットはハードコーディングしていますが、パスワードと同じ扱いをする必要があるため、実稼働する場合は暗号化するなどしてください。

$clientid = "<アプリケーション(クライアント)ID>"
$tenantName = "<アプリを登録したテナントのドメイン> 例(QiitaTest2020.onmicrosoft.com)"
$clientSecret = "<クライアント シークレット>"

6行目~11行目で「クライアント資格情報による認証」を実施します。

$ReqTokenBody = @{
    Grant_Type    = "client_credentials"
    Scope         = "https://graph.microsoft.com/.default"
    client_Id     = $clientID
    Client_Secret = $clientSecret
} 

13行目でアクセストークンを取得します。

$TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody

Graph APIの指定

17行目:Graph APIを指定します。指定するGraph APIは下記手順に従って確認します。

$apiUrl = '<Graph API>' 例('https://graph.microsoft.com/v1.0/Groups/')

ソースコードに記載するGraph APIを探す方法

1.下記URLにアクセスします。
  アクセスした際にサインインする必要はありません。
 (https://developer.microsoft.com/ja-jp/graph/graph-explorer#)
2.左側メニューの「サンプル クエリの検索」で、利用するAPIをキーワード検索します。
3.左側メニューから利用するAPIをクリックします。
4.画面上部にAPIが表示されるのでコピーします。
「自分の組織内のすべてのグループ」の場合は https://graph.microsoft.com/v1.0/groups です。
image.png

Graph APIの実行

18行目:Graph APIを実行します。

$Data = Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri $apiUrl -Method Get

19行目:Graph APIを通して取得したデータから、「Value」のみを抽出します。
20行目:Valueから「表示名」列と「説明」列を抽出します。

$Groups = ($Data | select-object Value ).Value
$Groups | Format-Table DisplayName, Description -AutoSize

取得結果

実行した結果、こんな感じで情報を取得できました。

displayName           description
-----------           -----------
テストチーム5        説明文5
テストチーム2        説明文2
PowerShell作成チーム1 説明文
テストチーム3        説明文3
テストチーム4        説明文4

取得した結果はソート順、抽出条件、表示件数を指定していません。
20行目を下記のどれかに変更することでソート順、抽出条件、表示件数を調整できます。

# オプション例--------------------------------
# フィルター
$Groups | Where-Object {$_.description -match "^説明文*"} | Format-Table DisplayName, Description -AutoSize
# ソート順変更(-Descending:降順、未入力:昇順)
$Groups | Sort-Object Description -Descending | Format-Table DisplayName, Description -AutoSize
# 表示数変更(-First:先頭から〇個、-Last:末尾から〇個)
$Groups | select-Object -First 3 | Format-Table DisplayName, Description -AutoSize
# フィルター 表示数 表示列(左から順に実行されていく、フィルターと表示数の定義が逆になると結果も変わってしまう)
$Groups | Where-Object {$_.description -match "^説明文*"} | select-object -first 3 | Format-Table DisplayName, Description -AutoSize

参考ページ

CONNECT AND NAVIGATE THE MICROSOFT GRAPH API WITH POWERSHELL
https://www.thelazyadministrator.com/2019/07/22/connect-and-navigate-the-microsoft-graph-api-with-powershell/#Admin_Consent

PowerShellでMicrosoft Graph APIを使用する
https://adamtheautomator.com/microsoft-graph-api-powershell/

リストグループ(MS公式サイト)
https://docs.microsoft.com/en-us/graph/api/group-list?view=graph-rest-1.0&tabs=http

Graph エクスプローラー(MS公式サイト)
https://developer.microsoft.com/ja-jp/graph/graph-explorer

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
12
Help us understand the problem. What are the problem?