MS Graphでテナントのライセンスを取得

Powershell Office365モジュールでは、簡単にテナントのライセンス情報を取得できるのだが、プログラムからMS Graphで取得するにはどうすればよいか、調べてみた。

調べ方が悪いのか、あまり例がヒットしなかったが、以下のような感じで取得できることを確認した。

まず、Azure AD上のアプリケーションに必要な、アクセス許可は以下の通り。

  • Origanization.Read.All
  • Directory.ReadAll
  • Organization.ReadWrite.All
  • Directory.ReadWrite.ALl

なぜ、Writeが必要なのかは不明・・・

取得方法だが、GraphへアクセスするためのServiceClientを作成して、.SubscribedSkus.GetAsync()メソッドを呼び出すだけ。

戻り値として、契約しているライセンス情報一覧が返される。

// GraphServiceClientの作成(Credentialの作成方法は省略)
var cli = new GraphServiceClient(cred);
// 契約しているライセンス情報一覧の取得
var lic = await cli.SubscribedSkus.GetAsync();

上記の場合、lic.ValueにList<SubscribedSku>?が入ってくる。SubscribedSkuには様々な情報が入ってくるが、特によく使うのは下記ぐらいだと思われる。

SkuPartNumberライセンス名ENTERPRISEPACKのような表記
ConsumedUnits使用ライセンス数
PrepaidUnits.Enabled購入数
主なプロパティ

この情報が取れれば、どのライセンスを何ライセンス契約していて、使用数が何ライセンスか分かり、計算すれば割当可能数も取得できるので、結構便利。

※SkuPartNumberはここに一覧がある。

以下実行例

GraphServiceClient cli = new GraphServiceClient(cred);
var lic = await cli.SubscribedSkus.GetAsync();
if (lic == null) {
    Console.WriteLine("Get License Fail");
    return;
}
if (lic.Value == null) {
    Console.WriteLine("Get License Fail");
    return;
}
foreach(var itm in lic.Value) {
    int all = (int)itm.PrepaidUnits.Enabled!;
    int use = (int)itm.ConsumedUnits!;
    Console.WriteLine($"{itm.SkuPartNumber},{all},{use},{all-use}");
}
/* 実行例
STREAM,XXXX,YY,MMMM
Dynamics_365_Sales_Premium_Viral_Trial,XXXX,YY,ZZZZ
WINDOWS_STORE,XXXX,Y,ZZZZ
ENTERPRISEPACK,XX,YY,ZZ
FLOW_FREE,XXXX,YY,ZZZZ
MICROSOFT_BUSINESS_CENTER,XXXX,Y,ZZZZ
POWERAPPS_VIRAL,XXXX,Y,ZZZZ
EXCHANGESTANDARD,XXX,YY,ZZ
POWER_BI_STANDARD,XXXX,Y,ZZZZ
OFFICESUBSCRIPTION,XXX,YYY,ZZ
Power_Pages_vTrial_for_Makers,XXXX,Y,ZZZZ
STANDARDPACK,XXX,YYY,ZZ
*/

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。 好きなことだけ拾って投稿しているので、内容にはあまり期待しないでねw
カテゴリー: .NET, C#, Microsoft Graph, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください