Microsoft Graphを使い始める記事はいくつも出てくるのですが、込み入った使い方をしようとすると急に情報が少なくなる印象があるので、この記事を書いてみることにしました。
使い始める際の情報はこれらを見るとよいです
Microsoft Graph を使ってみた! – Livestyleクラウドサービス
VIDEO www.youtube.com
シンプルな使い方
Microsoft Graphを使うにあたって、シンプルなタスクであればわりとすぐに使うことができます。Linux などからcurl でコマンドライン 経由で使えます。また、ワークフローに組み込んで、入ってきたデータに対してユーザーのグループ移動とかはシュッと作ることができます。userPrincipalNameを使ってidを取得して、そのユーザーのidと所属させたいグループのidの情報を渡してあげるだけです。curl で実行する際には、末尾の $ref が変数として認識されてしまわないようにシングルクォートで囲う必要があることに注意が必要です。
トーク ン取得処理
(xxxxx.onmicrosoft.comのxxxxxにはお使いのテナント名が入ります)
TOKEN=`curl -d "client_id=xxxxxxxxxxxxxx" -d "scope=https%3A%2F%2Fgraph.microsoft.com%2F.default" -d client_secret=xxxxxxxx -d "grant_type=client_credentials" -H "Content-Type: application/x-www-form-urlencoded" -X POST https://login.microsoftonline.com/xxxxx.onmicrosoft.com/oauth2/v2.0/token | jq -r .access_token`
userPrincipalNameを使ってidを取得する処理
curl -H "Authorization: $TOKEN" -H "Content-Type: application/json" https://graph.microsoft.com/v1.0/users/<userPrincipalName>
learn.microsoft.com
グループへメンバーを追加する処理
curl -D- -XPOST -H "Authorization: $TOKEN" -H "Content-Type: application/json" -d '{"@odata.id": "https://graph.microsoft.com/v1.0/directoryObjects/<user id>"}' 'https://graph.microsoft.com/v1.0/groups/<group id>/members/$ref'
learn.microsoft.com
少し込み入った使い方
仕事でMicrosoft 365のライセンス回りの棚卸しを行う必要がでてきました。ユーザー数 x ライセンス割り当て情報の数で、シンプルなタスクよりも扱う情報量が急に増えることになりました。
最初はMicrosoft GraphのHTTP API を使い、AzureADのユーザー情報をJSON に出力して、jqを用いてライセンス割り当て状況に応じてグループ分けを行ってみました。ユーザー一覧のJSON ファイルを手元に持つことになるうえに、jqでの検索が遅いという問題が出てきました。
では何かMicrosoft GraphのSDK を使おうとなり、私が使い慣れているRuby のSDK を検討したのですが、Ruby のSDK は"Microsoft Graph Ruby client library is not actively supported"となっており悲しみにくれました。
learn.microsoft.com
github.com
大学の研究室にいたころや、就職したての頃はJava を少し書いていましたが、Java で書く気持ちになれず、JavaScript は得意ではないし、などと考えた結局 .NET で実装してみることにしました。意外とできましたが苦労はありました。
認証まわり
Microsoft GraphをC# から使ううえで、どの認証ライブラリを使えばいいのか自信を持てませんでした。結局のところ、 Azure.IdentityとMicrosoft .Graphを組み合わせて使うことでうまくいきました。
またMicrosoft Graphは複数の認証方法をサポートしていますが、ドキュメントを読んでどの方法を使えばいいのか判断するのに苦労しました。
これを使えばよいことがわかりました
learn.microsoft.com
最初にこのページを見ると、大変そうだしどれを使ったらいいかわからないので、そっとタブを閉じたくなってきます
learn.microsoft.com
ライセンスまわり
ライセンスの棚卸しをしたいので、各ユーザーが使用しているライセンスを特定する必要があります。ここも苦労しました。EMS E3やE5などライセンスの種類がありますが、これらのライセンスはSkuIDが付与されています。最初はSkuIDで特定できることもわかりませんでしたし、下記ページを見つけられていなかったので、なんだこれはとなりました。以下ページ覚えておくと便利です。URLが変わってしまうかもしれないですが。
learn.microsoft.com
ユーザー情報にライセンス割り当ての属性(LicenseAssignmentStates)がありますが、ユーザーは複数のライセンスを持つ可能性があるうえに、SkuIDで識別されているので、よく使うSkuIDをハードコーディングする必要がありました。(今思えば別ファイルに切り出しておいても良かったかもしれないですね。
ライセンス割り当て方法に実は複数の種類があり、直接付与とグループによる割り当てがあります。LicenseAssignmentStatesのassignedByGroupというプロパティで取得することができます。AzureADの画面で、直接ライセンスを割り当ててしまうと直接となります。管理の観点からは、グループでのライセンス割り当てが望ましいので、これらを区別する必要がありました。そのため、各ライセンスが直接割り当てされているユーザーリストや、グループにより各ライセンスが割り当てられているユーザーリストを作成して棚卸しをしました。
紛らわしい話題
最後に紛らわしい話題だけどAD Graphは非推奨になっています。Microsoft Graphは便利なので廃止されないで残ってほしいです。
jpazureid.github.io