FormsとPower AutomateでEntra IDのゲスト招待システム&棚卸システムをつくってみる(その2)

Microsoft 365のユーザー管理の仕組みである Entra ID について、ゲスト招待を申請と棚卸しできるシステムをFormsとPower Automateをつかって作成してみようと思います。

初回(その1)はこちらをご覧ください。

前回は、システムでつかうデータベース部分をSharePointリストをつかって作成し、そのリストにユーザー側のインターフェイスとしてFormsを使って用意しました。

2回目の今回は、Power Automate(クラウドフロー)を使って、申請が行われた際の動作を作り込んでいきます。

全体的な流れとしては以下のようなイメージを持ってます。

  1. (その1)Formsでユーザーがゲスト招待申請を投稿する
  2. (その1)クラウドフローがSPOリストの追加によってトリガーされる
  3. (その2)入力されたゲストEmailがメールアドレスとして妥当か(正規表現が使える?)確認して、受付または却下メールを申請者へ送る(却下ならステータスを「却下」にして、備考に理由を書き込む。妥当ならステータスを「承認待ち」にして申請日を書き込む)
  4. (その2)承認者ユーザーに承認要求を送る。
  5. エラーになった場合は、Teamsチャネルへ投稿。管理者として承認して進むか、却下して申請者に差し戻しメールを送るかを選択。承認した場合は、上長(または管理者)のメールアドレスを承認者列に書き込む
  6. 承認が通ったら承認日時に書き込み、ステータスを「承認済み」に更新して次へ進む。30日間承認されない場合は、ステータスを「承認待ち30日期限切れ」に変えて申請者へメールを送る。却下の場合は、理由を含めたメールを申請者に送る
  7. 管理者としてEntra IDのゲストを登録する
  8. 登録が成功したら、SPOリストの棚卸期限列に、ゲスト招待期間の数字を加えた日付を登録する
  9. 登録が成功したら、承認者と申請者にメールで通知する
  10. 登録が失敗したら、管理者へ通知する(チャネル投稿)→Teamsチャネルを見て、エラーを確認し、手動でゲスト登録をしてSPOリストを書き換え、チャネルに行った対応を投稿する運用で回避。SPOリストにTeamsの投稿URLを入力できる列があっても良いかも。

今回は3の入力されたEmailアドレスが妥当な文字列かどうか判定する部分を作ります。

それができるアクションは?とMicrosoft Learnを探してみるとあるにはありましたが、プレミアムコネクタでした。

https://learn.microsoft.com/ja-jp/connectors/regexflowregularexpr/

他に方法はないものか?とググってみると、QiitaにOfficeScriptを使った方法が紹介されていました。こちらを使わせていただきます。

PowerAutomateで正規表現マッチ 参照元:https://qiita.com/mizukyf/items/f3d26e8c97d53e6ecd32

Office ScriptをSharePoint上に配置する

Officeスクリプトとは、最近(といっても数年前)にWeb上でもVBAっぽい自動化処理をExcelなどに組み込める仕組みです。このOfficeスクリプトは、Power Automateのクラウドフローから呼び出せるので、個人的にはExcel範囲のテーブル化などに使ったりしていました。

まず、SharePoint上にExcelファイルを用意します。SharePointサイトの「ドキュメント」を開いたブラウザから「+新規」>「Excelブック」を選択すると良いでしょう。

「自動化」 >「すべてのスクリプト」>「+新しいスクリプト」と開いて、コードを貼り付けます。このコードはQiita記事から拝借しています。regexMatchとスクリプトに名前をつけて、保存しました。

function main(
  workbook: ExcelScript.Workbook,
  searchString: string,
  regexPattern: string,
  regexFlags: string
) : Array<string> {
  return searchString.match(new RegExp(regexPattern, regexFlags)) ?? [];
}

前回はトリガーだけ作製したクラウドフロー

クラウドフローから正規表現用Officeスクリプトを呼び出す

前回はトリガーだけ作製したクラウドフローを開き、SharePointサイトに配置したOfficeスクリプトを呼び出します。「スクリプトの実行」アクションですね。

メールアドレスが妥当な文字列かどうかを判定するための正規表現について、Copilotさんに聞いてみます。これを使えば良いそうです。

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

「スクリプトの実行」には、先程保存したExcelファイルの場所と、名前をつけたスクリプトを選択します。

searchStringは、トリガーで取得できたゲストEmailを選択します。

正規表現の文字を「スクリプトの実行」のregexPatternに貼り付けます。regexFlagsは大文字と小文字を区別せずに検索するとよいので、「i」を入力しておきます。i (ignore case)の略文字です。 

テスト実行を「自動」で動作させ、前回の実行と同じトリガーで試しに動かしてみると、Formsで申請をしたゲストEmailが結果に1要素の配列として表示されています。パターンにマッチしたということなので、このメールアドレスの文法は正しいということになります。(たとえばアットマークが無いとか、ドットが抜けてるとかの問題がないことが保証された)

テストとして、申請フォームからデタラメなゲストEmailアドレスで送信してみます。

デタラメなメールアドレスだと、結果は[] というように空っぽの配列(要素0)として返ってきました。要素数が1なら問題なし。要素数が1以外なら却下にして良さそうです。

申請者へ受付メール/再申請依頼メールを送る

「スクリプトの実行」の結果配列にいくつの要素があるのかは、Length関数を使えばわかります。

length(outputs('スクリプトの実行')?['body/result'])

条件の左辺に式として上記を設定し、この値が1異常であれば受付メールを送信します。1以外であれば、問題があったことを知らせて、再申請してくれるように促します。

成功した場合に届いたメールです。テストをしながらどういう内容のメールが届けばよいか調整すると良いでしょう。あっ・・・。誰の承認待ちなのか、承認者氏名を設定するべきところが、申請者氏名にしちゃっていたみたいです。修正修正。

こちらは、ゲストのEmailアドレスが妥当ではなかった場合に届くメールのサンプルです。次に何をしたらよいか、FormsのURLを掲載してあげるのが親切でしょうね。

SPOリストへステータスを書き込む

Formsで入力された申請内容は、自動的にSPOリストに書き込まれますが、妥当性判定の結果は空欄のはずです。トリガーのなかに追加されたSPOリストのレコードを特定するID情報がありますので、それを使ってリストを更新しましょう。

トリガーが含む情報を確認するために、作成アクションに動的なコンテンツを設定してみます。「ID」というのがSPOリストに追加されたレコードだとわかります。

作成の中に設定した「ID」のところをCTRL+Cでコピーして、「はい」の中に「項目の更新」アクションを設置し、SPOリストの場所を設定したら、IDの項目にトリガーのID部分を設定します。

ちなみに、式で表すと以下のようになります。

triggerOutputs()?['body/ID']

ステータスの種類は下のようなものを用意しようと思います。

  • 却下
  • 入力内容不整合
  • 承認待ち
  • 承認待ち30日期限切れ
  • 承認済み
  • ゲスト
  • ゲスト追加失敗

はい/いいえ のそれぞれの場合にSPOリストに書き込むステータスを設定しましょう。

SPOリストのIDが取得できているので、問い合わせに備えてIDがわかるようにしておくと運用が楽になるかもしれません。適当な場所にIDを入れ込みましょう。

保存しようとしたら、エラーが出ました。どうやら、SPOリストで必須項目としている箇所が項目の更新で指定されていないためのようです。でも、もともとFormsの入力でトリガーされていて、入力済みだから更新しないなら空欄でも良いはずなのにおかしいですね。

リストの設定画面を開き、必須にチェックが入っていたものを外してやりました。

フローが保存できました。

いちおう検証のためにSPOリストと紐付いたFormsで、項目の「必須」トグルをオンにしてみると・・・。

必須かどうか、SPOリストとForms連動しとるんかい!!

ちょっと納得行かないものの、回避策としてトリガーに含まれている登録内容つかって必須項目に上書きするように設定しました。

ふたたび自動でテストしてみると、SPOリストにステータスが表示されました。

不整合メールを送ったらそこで処理は終わりなのできちんと終了させておきましょう。

承認要求の送信を送る

Formsで申請者が指定した承認者に対して、ゲストに加えてよいかどうかを判断してもらうために、承認要求を贈りましょう。「開始して承認を待機」というアクションを使います。「担当者」というのが判断をする人です。

「再割当てを有効にする」が「はい」になっていた場合、承認者は他の人に承認の判断を譲ることができますので、場合によっては承認者が変わる可能性があることをイメージしておきます。

Formsから申請してみると、申請者として指定したアデルさんのTeamsに通知が届きます。クリックすると、Teamsの承認アプリが起動して「ゲスト承認」または「承認しない」を選択できる画面が表示されました。

同じように、メールでも承認要求が届いています。Teamsでもメールでも、どちらかで承認ボタンがクリックされるとちゃんと同期されるのが素晴らしいところです。承認してみましょう。

承認の結果はこのように返ってきました。結果に表示されている「ゲストを承認する」を使って条件わけすれば良いですね。

今日はここまで

時間切れなので今日はここまでにします。次回(その3)では、承認されたゲストユーザーをEntra IDにゲストとして参加させる処理を作っていきます。

どんな人が作っている?

お仕事でPower BIやPower Automateクラウドフローを中心にちょっとした自動化などを行っています。

QiitaやこのブログではPower Automateの話題を中心に投稿を行っていますので、ぜひ「いいね」してくださると励みになります。