Microsoft Graphを使ったプログラミングにまつわる苦労

Microsoft Graphを使い始める記事はいくつも出てくるのですが、込み入った使い方をしようとすると急に情報が少なくなる印象があるので、この記事を書いてみることにしました。

使い始める際の情報はこれらを見るとよいです

Microsoft Graph を使ってみた! – Livestyleクラウドサービス

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

少し込み入った使い方

SDKまわり

仕事でMicrosoft 365のライセンス回りの棚卸しを行う必要がでてきました。ユーザー数 x ライセンス割り当て情報の数で、シンプルなタスクよりも扱う情報量が急に増えることになりました。 最初はMicrosoft GraphのHTTP APIを使い、AzureADのユーザー情報をJSONに出力して、jqを用いてライセンス割り当て状況に応じてグループ分けを行ってみました。ユーザー一覧のJSONファイルを手元に持つことになるうえに、jqでの検索が遅いという問題が出てきました。

では何かMicrosoft GraphのSDKを使おうとなり、私が使い慣れているRubySDKを検討したのですが、RubySDKは"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