PowerShell では、直接Graph APIを直接呼び出す方法も行えるのですが、通常、Graph SDKを利用するとより簡単に呼びだす事ができます。
Microsoft Graph PowerShell SDK はオープン ソースで開発され、Microsoft Graph を PowerShell から実行しやすくしたものになるのですが、このプロジェクトは GitHub で管理されていて、PowerShell Module は MIT ライセンスで配布されています。
有償で提供される製品とは異なり MIT ライセンスで無償で配布されている PowerShell Module のため、Microsoft による技術サポートの提供も限定的であったり内容によっては対応されなかったりします。
しかし、非常に使いやすくなっているので、ここでは「データを取得するためのプログラム認証」、「APIの呼び出し方」、「戻ってきたデータをプログラムで扱うための方法」の3つのパートに分けて説明します。
データを取得するためのプログラム認証
Powershellでアクセスするための認証方式には、以下の2つがあります。
- 委任認証(Deligate)
- アプリケーション認証
委任認証
ログインしたユーザの情報を利用してGraphデータにアクセスする方法になります。一番簡易的な方法で、Powershellの記載を、下のように、利用するAPIのアクセス権限を付与して記入します。
これを実行すると、Mircorsoftのサインインのウィンドウが開き、IDとパスワードを入力します。そのアカウントの権限を利用してGraphにアクセスするようになり、プログラムに委任してAPIを実行するという意味になります。
Connect-MgGraph -Scopes “User.Read.All”
アプリケーション認証
この認証は予めEntraにアプリケーションを登録し、IDとシークレットコードを発行し、テナントIDなどを利用してアクセスする方法となります。プログラム的には、下のようになります。
アプリケーションでも、各APIを利用する際には、権限が必要になりますが、その設定は、Entra管理センターでアプリケーションに対してプログラム動作に必要な権限を予め付与しておきます。
$clientId = “<クライアントID>”
$client_Secret_Code = “<クライアントシークレット>”
$clientSecret = ConvertTo-SecureString -String $client_Secret_Code -AsPlainText -Force $tenantId = “<テナントID>”
$scope = “https://graph.microsoft.com/.default”
#アクセストークン取得(MSAL認証)
$oauth = Get-MsalToken -ClientId $clientId -TenantId $tenantId -ClientSecret $clientSecret -Scopes $scope
#Micorosoft Graph接続
Connect-MgGraph -AccessToken $oauth.AccessToken
Graph APIの呼び出しかた
下のプログラムは、チームのメンバーを取得して、データと格納するところまでをプログラムにしてみました。Graph APIは、ページが多いとデータをいくつかに分割して受信するので、そのリンクの文字数が0になるまで、リンクを取得して配列($links)に格納しています。
$links = @()
$apiUrl = "https://graph.microsoft.com/v1.0/teams/<チームID>/members"
$links += $apiUrl #最初のエンドポイントのURLを格納
#全ページのリンクを取得
while($true)
{
$rec_detail = Invoke-RestMethod -Headers @{Authorization = "Bearer $accessToken"} -Uri $apiUrl -ContentType 'application/json' -Method Get
if($rec_detail.'@odata.nextLink'.Length -ne 0)
{
$apiUrl = $rec_detail.'@odata.nextLink'
$links += $rec_detail.'@odata.nextLink'
}else{
break;
}
}
返信内容を受け取ってプログラムで扱う
ここではforeach分で$linksから1つづつ読み出し$lに格納して、$lに格納して、その格納されたURLを利用して、データを読み出し、そこから1件づつデータを読み出して$mにオブジェクトを格納して標準出力に表示名とメールアドレスを表示しています。
#実データ取得開始
foreach($l in $links){
$rec_detail = Invoke-RestMethod -Headers @{Authorization = "Bearer $accessToken"} -Uri $l -ContentType 'application/json' -Method Get
foreach($m in $rec_detail.value){
Write-Output ("Name:" + $m.displayName)
Write-Output ("Email:" + $m.email)
以上のように認証して、データを取得して、データを表示するという3つに処理を分けて、記載してみました。