こんにちは、某輪っかを使って遊ぶゲームの先着販売に勝利した石川です。
今回はMicrosoft 365のライセンス(Azure AD P1とかPower BI Proとか)をSDKを使ったAzure Functionsから監視してみたいと思います。
前提条件
- Azureのテナントがある
- ADアプリ(サービスプリンシパル)を作成できる
- 何かしらのライセンスをテナントで所持している
保有しているライセンスは
Azure Portal => Azure Active Directory => ライセンス => すべての製品
から確認可能です。
ADアプリを作成する
Azure PortalのAzure Active Directoryブレードから作成します。
アプリの登録を押下するとこの画面に。新規登録を押下し、必要な項目を埋めます。
- 名前: アプリケーションの名前, 何でもOK
- サポートされているアカウントの種類: デフォルトのまま
- リダイレクトURI: 空欄のままOK
埋めるとこんな感じ。登録を押しましょう。
登録できました。
- クライアントID
- テナントID
を後から使うのでメモっておきます。
ADアプリに権限を付与する
Microsoft Graphをアプリケーションから叩くため、アプリケーションに必要な権限を割り当てる必要があります。
所有しているライセンスを取得するためには Directory.ReadAll
と Organization.ReadAll
を付与するとOKです。
先ほどの画面からAPIのアクセス許可を押下します。
アクセス許可の追加 を押下し、少しスクロールしてMicrosoft Graphを選択。
アプリケーションの許可を選択し、Directory.ReadAll
と Organization.ReadAll
を探して選択し、アクセス許可の追加を押下します。
最後に 「<テナント名> の同意を与える」を押下して完了です。ここで必要以上の権限を割り当てるともしアプリの情報が漏れたときに外部からAPIアクセスが通るようになってしまうので必要以上の権限を割り当てないようにしましょう。
このような表示になればOKです。
ADアプリのシークレットを発行する
次にADアプリへシークレットを発行します。
証明書とシークレットをクリックします。
このような画面になるので新しいクライアントシークレットを押下し、必要項目を入力/選択して追加します。
- 説明: クライアントシークレットの説明(〜用など自由に入力)
- 有効期限: シークレットの有効期限を選択
埋まったら追加をクリックするとシークレットが発行されます。
発行されたシークレットが表示されますが発行したタイミングでしか確認ができないので、必ずメモしておきましょう。
SDKを使って実装する
ここからはコードを書いて実装していきます。
クライアントID, テナントID, シークレットは環境変数から読むように記述していますので適宜読み替えてください。
まずはNuGetからSDKを導入します。
dotnet add package Microsoft.Graph
Graph SDKは以下の手順で利用します。
- IConfidentialClientApplicationの作成
- ClientCredentialProviderの作成
- GraphServiceClientの作成
- 有効なライセンスの取得
では順にやっていきましょう。
- IConfidentialClientApplicationの作成
var adapplication = ConfidentialClientApplicationBuilder
.Create(Environment.GetEnvironmentVariable("ClientId"))
.WithTenantId(Environment.GetEnvironmentVariable("TenantId"))
.WithClientSecret(Environment.GetEnvironmentVariable("ClientSecret"))
.Build();
クライアントID, テナントID, シークレットをここで読み込み、認証情報を作成します。
2. ClientCreadentialProviderの作成
var provider = new ClientCredentialProvider(adapplication);
作ったIConfidentialClientApplicationを使ってClientCredentialProviderを作成します。
次にこれを用いてGraphServiceClientを生成します。
3. GraphServiceClientの作成
var client = new GraphServiceClient(provider);
4. 有効なライセンスの取得
var subscribedSkus = await client.SubscribedSkus
.Request()
.GetAsync();
これでsubscribedSkusに有効なライセンスがIGraphServiceSubscribedSkusCollectionPageとして取得できたので、あとは煮るなり焼くなりご自由に!IEnumerableと同じように扱えるのでforeachとかでぶん回して出力するなりしちゃうといい感じになります。
社内ではSlackのBotにしてデイリーでメッセージを投稿するようにしています。いろいろ消してますが以下のようになってます。
おつかれさまでした