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
*/