Power Virtual Agents と Power Automate でユーザーにライセンスを付与するチャットボット作成【情シスボットシリーズ②】


# はじめに
前回の [「Power Virtual Agents と Power Automate でユーザーのパスワードリセットするチャットボット作成【情シスボットシリーズ①】」](https://qiita.com/MiyakeMito/items/e433059661dbfcd4fdf4)に続き、情シス向けチャットボット第２弾です。
指定したユーザーに、任意のライセンスを付与するリセットチャットボットを構築しました。
Power Automate で組織内にユーザーを作成するのは、Azure ADコネクタの「ユーザーの作成」アクションで可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/4ae948a7-85c1-0004-45b9-7765d77d43ca.png)
しかし、**ライセンスを付与するアクションは存在しないため、Graph APIを利用し実現します。**
# 注意
プレミアムコネクタを利用します。有料ライセンスが必要です。
運用環境での使用は許可されていませんが、開発向けプランや開発者テナントであれば無償でお試しいただけます。

[開発者向けプラン](https://powerapps.microsoft.com/ja-jp/developerplan/)
[Microsoft 365 開発者テナント ](https://developer.microsoft.com/ja-jp/microsoft-365/dev-program)


# 構築

実際の作成手順です

## 1．Azure AD アプリケーション登録

[user: assignLicense](https://docs.microsoft.com/ja-jp/graph/api/user-assignlicense?view=graph-rest-1.0&tabs=http)を利用します。

https://docs.microsoft.com/ja-jp/graph/api/user-assignlicense?view=graph-rest-1.0&tabs=http


### 1-1．アプリケーション登録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/42e7a6a5-271b-18e0-a30a-68e5dcd59e5d.png)

今回利用するGraph APIは、「User.ReadWrite.All」と「Directory.ReadWrite.All」のアクセス許可が必要です。

![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/8d2e4712-2808-7a86-9a23-a04be5727ebd.png)

https://portal.azure.com/ に管理者権限でログインし、[アプリの登録]－[新規作成]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/0e6efe0c-c6e2-2717-ab03-eb5cef3737d4.png)

任意の名前を入力、アカウントの種類を追加。
対象がテナントユーザーであれば、「この組織ディレクトリにのみ含まれるアカウント」で問題ありません。







### 1-2．APIアクセス許可設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/72617870-0fc8-aa10-806f-f9c2512115ea.png)

[APIのアクセス許可]－[アクセス許可の追加]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/b4072a6f-53d0-f762-919d-6a0dc0486fed.png)


[Microsoft Graph]を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/50a9b474-6753-1d5b-7814-15683dd49ff0.png)


[アプリケーションの許可]－[{User.ReadWrite.Allで検索し}]－[User.ReadWrite.Allをチェック]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/b862947f-08e7-5409-86d8-e90ec056a8ba.png)

[{Directory.ReadWrite.Allで検索し}]－[Directory.ReadWrite.Allをチェック]－[アクセス許可の追加]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/03cc8594-b4ab-91c8-9243-34cdc0425220.png)


追加したアクセス許可に管理の同意を与えます。









![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/465b60c0-8589-b57d-9950-042b23d24c84.png)






### 1-3．クライアントシークレット追加

![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/1cd5c73e-522f-cb2b-6162-dd301c7739e9.png)

クライアントシークレットを追加します。


![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/4f9a6503-f93b-36e0-efd8-c59c96046f30.png)

クライアントシークレットの有効期限は、以前「無制限」が存在していましたが、今は最長24ヶ月です。
ただし、Powershellからの追加であれば設定可能です。
https://jpazureid.github.io/blog/azure-active-directory/azuread-clientsecrets-202104/


![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/2e5374d4-75e5-21a9-6428-ebb5c429e8e4.png)

シークレットの値をコピーしておきます。

:::note warn
この画面から遷移してしまうと、シークレットの値は再表示できなくなります。
:::


## 2．チャットボット作成

### 2-1．トピック作成

続いて、パスワードリセットのチャットボットを作成します。
トピックで、パスワードリセット対象UPNを問い合わせする質問を作成し保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/7995ba13-6611-d1bb-b245-7aecc04e0a0c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/14845bdc-f6fc-633d-5b6d-8463817ccd29.png)

フローの作成し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/ff4fcbea-b841-2ea4-8646-dcc265dffd29.png)

Power Virtual Agents フローテンプレートを選択します。





### 2-2．Power Autoamte Inputパラメータ設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/9b4d6102-faa8-8d58-1368-a54a448608de.png)

Power Virtual Agents からの引数は、パスワードリセット対象の userPrincipalName です。


### 2-3．assignLicense実行



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/5a06a20a-3517-8b53-ce2c-7db608202ccd.png)

HTTPアクションを選択し、以下のように設定します。

![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/a8e54d82-88a3-dc4e-40c6-3469ef3b5907.png)




■方法
```
POST
```

■URI
```
https://graph.microsoft.com/v1.0/users/@{triggerBody()['text']}/assignLicense
```
`@{triggerBody()['text']}`　は、「2-2．Power Autoamte Inputパラメータ設定」で追加したパスワードリセット対象の userPrincipalName です。


■ヘッダー
```
Content-Type : application/json
```

■本文
```
{
  "addLicenses": [
    {
      "disabledPlans": [],
      "skuId": "{GUID}"
    }
  ],
  "removeLicenses": []
}
```

`{GUID}`には以下サイトで付与するライセンスのGUIDを探し、入力してください。

https://docs.microsoft.com/ja-jp/azure/active-directory/enterprise-users/licensing-service-plan-reference

* Microsoft 365 E3 
  05e9a617-0261-4cee-bb44-138d3ef5d965

* Microsoft 365 E5
  06ebc4ee-1bb5-47dd-8120-11324bc54e06

* ENTERPRISE MOBILITY + SECURITY E3
  efccb6f7-5641-4e0e-bd10-b4976e1bf68e

* ENTERPRISE MOBILITY + SECURITY E5
  b05e124f-c7cc-45a0-a6aa-8cf78c946968

* Microsoft 365 E5 Developer (Windows および Audio Conferencing なし)　
  c42b9cae-ea4f-4ab7-9717-81576235ccac

などになります。

複数ライセンスを付与する場合は、配列型の`"addLicenses"`に要素を追加します。

```
{
  "addLicenses": [
    {
      "disabledPlans": [],
      "skuId": "c42b9cae-ea4f-4ab7-9717-81576235ccac"
    },
    {
      "disabledPlans": [],
      "skuId": "5b631642-bd26-49fe-bd20-1daaa972ef80"
    }
  ],
  "removeLicenses": []
}
```

ライセンスをはく奪する場合は、`"removeLicenses"`に要素を追加します。
配列型なので複数ライセンスを設定することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/69d827cb-2225-074b-7796-018393ed709f.png)

■認証
　Active Directory Oauth を選択

■テナント
　{ディレクトリ(テナント)ID}

■対象ユーザー

```
https://graph.microsoft.com
```

■クライアントID
　{アプリケーション(クライアント)ID}

:::note info
テナントとクライアントIDの値は、1-1.アプリケーション登録で登録したアプリの登録の[概要]に記載された値になります。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/d59c42a1-673e-357d-fd95-a430bc2b64f2.png)
:::

■シークレット

:::note info
シークレットの値は、「1-3．クライアントシークレット追加」のシークレットの値です。
:::


### 2-4．Power Autoamte Outputパラメータ設定

![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/a737370e-1b29-a05d-eb12-5764e2667895.png)

ライセンス付与完了旨のメッセージを、チャットボットに返します。


### 2-5．トピックからフローの呼び出し

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/adf2a9d3-197c-dfff-557d-9128c1f38615.png)

作成したフローをチャットボットから呼び出し、パラメータを設定します。
InputとOutputを設定します。



# まとめ

情シス用ボット第2弾として、指定ユーザーにライセンスを付与する機能を作成しました。
是非ご活用ください。