MS Graphでユーザー追加とライセンス付与

またまた、MS Graphの話で申し訳ないのだが、チョット嵌った点があったので、メモ。

MS Graphを使用して、Office365のユーザーを追加するプログラムを書いてみた。MSのドキュメントにはユーザー作成時にライセンスを付与できるとも、できないとも書いていないので、一応、ライセンス付きで試してみたが、NG。(Bing AI君に聞いてみたら、「ユーザー作成時にはライセンス付与できません。」と言われた。「ドキュメントにはハッキリとは書いてありませんが・・・」だと。AI君が正しいかどうかは分からんが。)

仕方がないので、ユーザーを追加してから、ライセンスを付与する形にしてみた。

以下動作したプログラム

//
// ユーザーの作成とライセンス付与
// どうも、ユーザー作成時にライセンスを付与することはできないようだ。
//	(ドキュメントには明記されていないようだが・・・)
// 仕方ないので、ユーザーを作成して、その後、ライセンスを付与することとする。
// ちなみに、こちらもドキュメントには書かれていないが、ユーザー作成時にはUsageLocationと
// PreferredLanguageは必須!
// これがないと、ユーザーをEnableにできないし、ライセンス付与もできない。
//
var cred = new UsernamePasswordCredential(ManageUser,ManagePass,TenantID,AppID,options);
var cli = new GraphServiceClient(cred);

var request = new User() {
    UserPrincipalName = "boo@foo.com",
    MailNickname = "boo",
    AccountEnabled = true,
    DisplayName = "Boo.Foo(Mr.Boo)",
    Surname = "Foo",
    GivenName = "Boo",
    PasswordProfile = new PasswordProfile() {
        Password = MakePassword(),
        ForceChangePasswordNextSignIn = true
    },
    UsageLocation = "JP",	// 必須!
    PreferredLanguage = "ja-JP",	// 必須!
};
var res = await cli.Users.PostAsync(request);

// ユーザー追加要求後すぐにライセンス付与を行おうとするとエラーになったので、
// とりあえず、1秒程まってから、ライセンスを追加する。
Thread.Sleep(1000);
var licreq = new Microsoft.Graph.Users.Item.AssignLicense.AssignLicensePostRequestBody() {
    AddLicenses = new List<AssignedLicense>() {
        new AssignedLicense() {
            DisabledPlans = new(),  // ←これは無くても大丈夫
            SkuId = Guid.Parse("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
        }
    },
    RemoveLicenses = new()  // ←削除するライセンスが無くても空配列が必要なようだ。
};
await cli.Users["boo@foo.com"].AssignLicense.PostAsync(licreq);

プログラムコメントにも書いているが、ユーザーの属性として、UsageLocationとPreferredLanguageは必須。(MSのGraph APIドキュメントには書いてない)

ライセンス付与の方だが、MSのサンプルはMe.AssignLicense.PostAsyncを使用した例のみが載っていて、ユーザー指定のライセンス付与の例は載っていなかったのだが、使用するRequestBodyのクラス名が異なるだけで、内容は同じようだ。

AddLicensesはAssignedLicenseクラスのリストで、ここに付与するライセンスを列挙する。多分、DisabledPlansは使用することはほぼないだろうと思われる。SkuIdはライセンスのSkuId(以前の記事で取得できる、SubscribedSkuクラスのメンバー)を指定する。

もちろん、複数のライセンスを付与することが可能。

ちなみに、RemoveLicenseは付与されているライセンスを削除するためのものだが、もちろん、今回は使用しない(というか削除するライセンスが無い)。削除するライセンスが無くても、空配列(C#上はListだが)を指定しないと実行時エラーとなる。(ここも嵌まった点)

後はcli.Users[UserPrincipalName].AssignLicense.PostAsync()に作成したインスタンスを渡せば、ライセンスが付与される。

ちなみに、プログラムコメントに書いたように、ユーザー作成⇒ライセンス付与をDelay無しで行なうと、実行時エラーとなってしまった。とりあえず、1秒置いてからライセンス付与をしているが、実際の所、どの程度の時間が必要なのかは不明。作成したユーザーを別スレッドで検索して検索OKまで待つような処理が必要かも。

ちなみに、必要な特権はドキュメント上は下記となる。使用しているAzureアプリには色々と特権付けているので、本当にこれだけで大丈夫か分からんが・・・

  • User.ReadWrite.All
  • Directory.ReadWriteAll

takezou について

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

MS Graphでユーザー追加とライセンス付与 への1件のコメント

  1. takezou のコメント:

    必須項目はUsageLocationだけでなく、PreferredLanguageが必須だったので、修正。これがないと、IsLicensedがfalseとなってしまう。

コメントを残す

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

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