FormsとPowerAutomateでMicrosoft 365のアカウント払い出しフォームを作った。 



社内でMicrosoft 365の検証環境を構築した時のことを記録しておきます。
今回はFormsとPowerAutomateで、アカウント払い出しフォームを作成しました。

- [1. はじめに](#1-はじめに)
  - [1.1. 前提・制約](#11-前提制約)
  - [1.2. 概要](#12-概要)
- [2. 構成](#2-構成)
  - [2.1. Forms](#21-forms)
  - [2.2. PowerAutomate](#22-powerautomate)
    - [2.2.1. トリガーとFormsの情報取得](#221-トリガーとformsの情報取得)
    - [2.2.2. アカウント作成](#222-アカウント作成)
    - [2.2.3. メール・Teams通知](#223-メールteams通知)
    - [2.2.4. フローの共有化](#224-フローの共有化)
- [3. Tipsなど](#3-tipsなど)
  - [3.1. PowerAutomateテンプレートの挙動がおかしい？](#31-powerautomateテンプレートの挙動がおかしい)
  - [3.2. PowerAutomateで動的コンテンツがGUI表示されない](#32-powerautomateで動的コンテンツがgui表示されない)
  - [3.3. MattermostへのWebhookができない](#33-mattermostへのwebhookができない)
  - [3.4. 動的なライセンス付与ができない](#34-動的なライセンス付与ができない)
  - [3.5. 異常系の処理を断念](#35-異常系の処理を断念)
  - [3.6. フローの共有](#36-フローの共有)
- [4. 参考](#4-参考)


# 1. はじめに
## 1.1. 前提・制約
弊社の場合、以下の前提・制約があります。

- テナント全体が検証環境
- 365を社内のコミュニケーションツールとして導入予定なし
  - 既に別途コミュニケーションツールを整備済み
    - ~~上記コミュニケーションツール（Mattermost）と連携がしたい~~ライセンス都合で出来ず…
  - 社内ディレクトリサービス（SMB）との連携なし
    - 希望した社員個別にアカウントを払いだす
- 費用は可能な限り削減
  - 1年目、ライセンスは[Microsoft Teams Exploratory](https://docs.microsoft.com/ja-jp/microsoftteams/teams-exploratory)を使用
  - 2年目以降は利用実績を見て、[Microsoft 365 Business Basic](https://www.microsoft.com/ja-jp/microsoft-365/business/microsoft-365-business-basic?activetab=pivot%3aoverviewtab)を購入予定
- 可能な限り365を利用する


## 1.2. 概要
以下、システムの概要図です。
ユーザーががFormsで作成した払い出しフォームにアカウント名を入力すると、アカウントが作成されます。

払いだしたアカウント情報の通知は、MattermostというチャットツールにWebHookで通知しようと思ったのですが、
PowerAutomateでWebhookをするにはPowerAutomateのPremiumライセンスが必要なため、メールとしています。

同様にライセンス付与も自動化したかったですが類似の制約により、管理者が通知を確認後、手動で付与としています。


![365.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/a488a3a8-b40f-7593-8566-40332ba4e7d9.png)



# 2. 構成
## 2.1. Forms
Formsで払い出しフォームを作成します。

「アカウント名入力」には、社内ディレクトリサービスのアカウント名と同一のものを手入力してもらいます。
※管理面や、今後365を正式導入した際の社内ディレクトリサービスとのアカウント連携する可能性を考慮。

画像を挿入したり、テーマを変更してコーポレートカラーに寄せることもできますが、割愛します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/48699f72-a53d-b65a-1692-22b081d43b32.png)

「共有」から、公開範囲の設定を変更します。
FormsはMicrosoft認証なしでも利用できるリンクを作成可能なため、外部公開が簡単です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/e459d926-b19c-ef29-7c71-99d816694725.png)


## 2.2. PowerAutomate
新規フローとして作成しました。
※理由は後述

以下がフロー全体です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/d1653534-5d74-6888-1f82-2244e83b7b85.png)

### 2.2.1. トリガーとFormsの情報取得
トリガーと「応答の詳細を取得する」アクションを作成します。
「応答の詳細を取得する」アクションを使うことで、フォームの入力内容などを各アクションで利用できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/304f36ed-1f82-ae14-2f5d-2cc217e50a99.png)


### 2.2.2. アカウント作成
「変数を初期化する」アクションで、初期パスワードを作成します。
テンプレートを参考に、現在時刻をもとに作成します。

「ユーザーの作成」アクションでは「応答の詳細を取得する」アクションで取得したフォームで入力したアカウント名を、各項目にしていきます。
UPNには弊社365環境のドメインを末尾に追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/a26fa158-faa4-0743-647f-686c37178248.png)



### 2.2.3. メール・Teams通知
「メールの送信アクション」で、アカウント情報（UPN・パスワード）をメールにてユーザーに通知します。
手動で行うライセンスの付与が間に合っていませんのでその旨や、他の注意事項を記載して通知します。
また、あて先は弊社既存のメールアドレスなので、フォームで入力したアカウント名＋弊社ドメインとします。


「チャットまたはチャネルでメッセージを投稿する」アクションで、管理者に通知します。
この通知を確認後、管理者はユーザーにライセンス付与をします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/8a1fb0cf-1a2a-62b7-b556-e258487c8865.png)



### 2.2.4. フローの共有化
フロー管理のため、個人のフローから共有フローに変更します。
同様に管理者用チームも所有者に加えます。

また、今回は私個人のアカウントでフローを作成したため、各コネクタが個人のアカウントに紐づいたものになっています。
なのでPowerautomate用のシステムアカウントに変更します。


# 3. Tipsなど

## 3.1. PowerAutomateテンプレートの挙動がおかしい？
フロー作成時にテンプレートを流用しようとしましたが、「ボタンをクリックして、新規 Azure AD ユーザーアカウントを作成します」テンプレートの「応答の詳細を取得する」での動的なコンテンツが正しく？表示されず、フォームの情報をうまく取得できませんでした。

そのため、テンプレートを流用せずに新規フローとして作成しています。

「応答ID」ではなく、「応答通知の一覧 応答ID」アクションが表示され、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/b81eebed-2255-2cb7-279a-d9147a35952c.png)

選択するとコントロールの「applye to each」が勝手に付与され、それ以降のアクションでフォームの動的なコンテンツが利用できませんでした。


## 3.2. PowerAutomateで動的コンテンツがGUI表示されない
Powerautomate の動的なコンテンツがGUIから選択できない場合がありました。
コピペすることが可能なので、別の項目でGUIから選択後、コピペすることで解決しました。



## 3.3. MattermostへのWebhookができない
PowerAutomateでコネクタが提供されていないアプリケーションへのWebhookを行うにはPowerAutomateのPremiumライセンスが必要であることがわかりました。

Mattermostはコネクタ提供がなく、断念しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/65cd6052-87a1-c979-5c24-c992364dc0fc.png)



## 3.4. 動的なライセンス付与ができない
ライセンスを操作するPowerautomateのアクションがありませんでした。

MSサポートに問い合わせを試みるも、PowerPlatform 管理センターからの問い合わせは別ライセンスが必要。
Azure Atiomation にて、スクリプトを実行して付与することも検討しましたが、Azure AtiomationへのPowerautomateアクションにもプレミアムライセンスが必要なため、断念。管理者にて手動で行う方向性に変更しました。

なお、Azure ADのPremiumライセンスなどがあれば、Azure ADの機能で付与することはできます。

https://docs.microsoft.com/ja-jp/azure/active-directory/enterprise-users/licensing-groups-assign

## 3.5. 異常系の処理を断念
フォームに入力したアカウントが、社内ディレクトリサービスになかった場合の動作の作成を検討しましたが、断念しました。
理由としては以下です。

- 社内ディレクトリサービスとの連携がないので、事前にアカウントアカウントの存在確認ができない
- メールでのバウンスメールで判断しアカウント削除とすると別フローの作成が必要となり、管理が煩雑
- ライセンス付与は手動となること
- 弊社ドメインのメールアドレスに通知を行うため、セキュリティ上問題がないこと

## 3.6. フローの共有

このままではフローのメンテナンスを行えないので、フローの共有を行います。
併せて所有者に他の管理者や、管理者が所属しているチームを追加しマス。
また、コネクタのユーザーを作成者個人からPowerAutomate実行用のユーザーに変更します。
PowerAutomate実行用のユーザーを作成し、そのユーザーに変更することで、OutlookやTeamsからの通知元を変更することが出来ます。







# 4. 参考

https://support.microsoft.com/ja-jp/office/microsoft-forms-%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-dee28c00-503a-48b3-89df-91a5084e6e43


https://docs.microsoft.com/ja-JP/power-platform/admin/power-automate-licensing/types?WT.mc_id=365AdminCSH_PPACA1


https://dynamics.microsoft.com/ja-jp/support/

https://docs.microsoft.com/ja-jp/power-automate/create-team-flows