欲しいアプリは自分で作る!

Power Platform や Azure などを利用して作成した業務アプリや趣味アプリなどをご紹介します。

Power Automate で組織の連絡先のメールアドレスから所属グループを抽出する

Graph API の可能性を感じます。




どうも、じゅんじゅんです。


Microsoft 365 管理センターには、個別で管理できる連絡先とは別に、組織で管理できる連絡先があります。
配布グループにテナント外のメールアドレスを含めるには、組織の連絡先から選択する必要があるため、配布グループに追加したいメールアドレスは組織の連絡先に登録する必要があります。

で、問題なのが、組織の連絡先に追加したメールアドレスがどの配布グループに属しているかが、管理センター上では探すのが大変という点。
連絡先側からは所属グループが分からないので、管理センター上で手動で探すには、すべての配布グループを1つずつ開いてメールアドレスを検索する必要があります。
(私が知らないだけかも…もしご存知の方がいましたら教えてください!)

f:id:jn-kodama:20200822184510p:plain
どこを見ても所属グループが分からない(Exchange 管理センターも同様)

f:id:jn-kodama:20200822184215p:plain
一般ユーザーなら確認できる

「この連絡先ってもう消していいよね?」という時に、「ちょっと待って!どの配布グループにも属してないか調べるから!」といっても、それはそれは大変な作業になります。


Graph API で取得できる

実は、Graph API を使えば、組織の連絡先の所属グループを取得することができます。

docs.microsoft.com

ただ、管理者が全員 Graph API の扱いに慣れている訳でもない。
何とかして、連絡先のメールアドレスを入力するだけで、所属グループを教えてくれる仕組みがあるといいな。

ということで、Power Automate で解決してみました。


作るもの

Teams のチャネルに連絡先メールアドレスを投稿すると、所属しているグループを返信で教えてくれる仕組みを作ります。
Teams のチャネルへの投稿を Power Automate で検知し、Graph API を利用して該当メールアドレスの所属グループを取得し、Teams に返信するというものです。

f:id:jn-kodama:20200822191433p:plain
Teams の画面イメージ


Power Automate 全体像

全体はこんな感じです。
処理の概要は以下の通りです。

  1. Teams の入力文字(メールアドレス)を抽出する
  2. メールアドレスに該当する連絡先の ID を Graph API を用いて取得する
  3. 該当の連絡先の所属グループを Graph API を用いて取得する
  4. 該当の連絡先のグループ情報を変数に追記する
  5. Teams のメッセージに返信する

f:id:jn-kodama:20200822191655p:plain
Power Automate の処理全体像


なお、HTTP コネクタを使用しますので、有償プランが前提となります。ご了承ください。


作成方法

Graph API を利用するには、Azure Active Directory でアプリを登録する必要がありますので、先にその作業を行います。

Azure Active Directory でアプリを登録する

Azure Active Directory にアクセスし、画面左側の "アプリの登録" を選択します。 f:id:jn-kodama:20200822204346p:plain

"新規登録" を選択します。 f:id:jn-kodama:20200822204531p:plain

適当な名前を付け、"登録" を選択します。
サポートされているアカウントの種類は、今回のようなケースではシングルテナントで問題ないと思います。 f:id:jn-kodama:20200822205247p:plain

アプリが登録されたら、続いてこのアプリに組織の連絡先情報を読み取るためのアクセス許可設定設定を行います。
画面左側の "API のアクセス許可" を選択し、"アクセス許可の追加" を選択します。 f:id:jn-kodama:20200822210117p:plain

"Microsoft Graph" を選択します。 f:id:jn-kodama:20200822210246p:plain

"アプリケーションの許可" を選択します。 f:id:jn-kodama:20200822234204p:plain


ここで許可するアクセスを選択するのですが、どのアクセスが必要かを調べます。
今回使用する Graph API は、

の2つなので、それぞれのページの "Permissions" を調べると、アプリケーションの許可の場合の必要最低権限は

  • 組織の連絡先を取得する
    OrgContact.Read.All

  • 組織のとある連絡先の所属グループを取得する
    OrgContact.Read.All and Group.Read.All

であることが分かります。
※英語で見てください。日本語だと Permissions の情報が正常に表示されません。

ということで、OrgContact.Read.All と Group.Read.All の2つを許可します。
"OrgContact" の中にある "OrgContact.Read.All" と、"Group" の中にある "Group.Read.All" にチェックを入れ、"アクセス許可の追加" を選択します。 f:id:jn-kodama:20200822234825p:plain f:id:jn-kodama:20200822234839p:plain

"(テナント名)に管理者の同意を与えます" を選択します。
何か尋ねられるので、"はい" を選択してください。 f:id:jn-kodama:20200822235214p:plain

同意が正常に付与されたことを確認します。 f:id:jn-kodama:20200822235557p:plain

最後に、Graph API 利用時の認証に使用するクライアントシークレットを取得します。 画面左側の "証明書とシークレット" を選択し、"新しいクライアント シークレット" を選択します。 f:id:jn-kodama:20200822211821p:plain

適当な説明を入力し、"追加" を選択します。
有効期限はご自由に設定してください。 f:id:jn-kodama:20200822211953p:plain

クライアントシークレットが表示されます。一度他の画面に遷移すると再び表示させることができなくなりますので、忘れずにコピーしておきます。
(コピーし忘れたら、追加したクライアントシークレットを一旦削除して、再度追加しましょう) f:id:jn-kodama:20200822212453p:plain

最後に、以後の手順で必要となるアプリケーション(クライアント)ID とディレクトリ(テナント)ID をコピーします。
画面左側の "概要" を選択して表示される上記の ID をコピーしておきます。 f:id:jn-kodama:20200822212842p:plain


Power Automate でフローを作成する

いよいよフローの作成に入ります。

処理の概要のおさらいです。

  1. Teams の入力文字(メールアドレス)を抽出する
  2. メールアドレスに該当する連絡先の ID を Graph API を用いて取得する
  3. 該当の連絡先の所属グループを Graph API を用いて取得する
  4. 該当の連絡先のグループ情報を変数に追記する
  5. Teams のメッセージに返信する


1. Teams の入力文字(メールアドレス)を抽出する

今回は Teams のチャネルへの書き込みをトリガーにしますので、下図のトリガーを利用します。利用したいチームとチャネルを指定してください。
続いて、Teams に書き込まれた内容は HTML タグが付いているため、"Html to text" アクションを利用して余計なタグを取り除きます。
あとは、抽出したグループ情報を順次追加するための文字列変数を初期化しておきましょう。 f:id:jn-kodama:20200822213949p:plain


2. メールアドレスに該当する連絡先の ID を Graph API を用いて取得する

ここでは、以下の Graph API を利用します。

docs.microsoft.com

https://graph.microsoft.com/v1.0/contacts とすればすべての組織の連絡先を取得できるのですが、今回必要なのは1.で入手したメールアドレスの連絡先情報だけなので、Filter クエリを利用します。
"HTTP" アクションを追加し、以下の通り設定します。

方法 GET
URI https://graph.microsoft.com/v1.0/contacts?$filter=mail eq '(Html to textのコンテンツ)'
認証 Active Directory OAuth
テナント アプリ登録時にコピーしたディレクトリ (テナント) ID
対象ユーザー https://graph.microsoft.com
クライアント ID アプリ登録時にコピーしたアプリケーション (クライアント) ID
資格情報の種類 シークレット
シークレット アプリ登録時にコピーしたクライアント シークレット

f:id:jn-kodama:20200822220053p:plain


なお、認証方法はアクセストークンを用いずクライアントシークレットを利用した方法を利用しています。
ここは Microsoft MVP の太田さんの記事が大変参考になりました。

idea.tostring.jp


続いて、取得した連絡先情報から ID を抽出するため、"JSON の解析" アクションを追加して Graph API で Get した JSON 形式のデータの解析を行います。
スキーマは自分で書くのはしんどいので、一旦上記の HTTP アクションまでで一度フローを作動させ、実行結果の HTTP アクション内の本文(=取得した連絡先情報)をコピーして、JSON の解析アクションの "サンプルから生成" をクリックして貼り付けると楽です。

f:id:jn-kodama:20200822220748p:plain
実行結果の HTTP アクションの本文をコピーし…

f:id:jn-kodama:20200822221117p:plain
JSON の解析アクションの "サンプルから生成" をクリックして貼り付けると…

f:id:jn-kodama:20200822221249p:plain
こうなる


3. 該当の連絡先の所属グループを Graph API を用いて取得する

続いて、先程取得した組織の連絡先の ID を用いて、連絡先の所属グループを取得するために、以下の Graph API を利用します。

docs.microsoft.com

"HTTP" アクションを追加し、URI を以下のように設定します。

https://graph.microsoft.com/v1.0/contacts/(式)/memberOf

(式)には、以下を式として入力します。
解析した JSON の ID の一番最初のものを抽出しています。

first(body('JSON_の解析')?['value'])?['id']

URI 以外の設定は先程の HTTP アクションと同じです。

f:id:jn-kodama:20200822221635p:plain


続いて、取得したグループ情報からグループ名とメールアドレスを抽出するため、"JSON の解析" アクションを追加し Graph API で Get した JSON の解析を行います。
スキーマは先程と同様に、一旦上記の HTTP アクションまでで一度フローを作動させ、実行結果の HTTP アクション内の本文(=取得した連絡先情報)をコピーして、JSON の解析アクションの "サンプルから生成" をクリックして貼り付けると楽です。

f:id:jn-kodama:20200822223151p:plain


4. 該当の連絡先のグループ情報を変数に追記する

先程抽出した所属グループ情報を、文字列変数に追加していきます。
"文字列変数に追加" アクションを追加し、1.で初期化した変数に対してグループ名とグループのメールアドレスを設定します。
※Apply to each は自動的に挿入されます。 f:id:jn-kodama:20200823000154p:plain


5. Teams のメッセージに返信する

最後に、先程の変数の内容をそのまま Teams で返信します。
"メッセージ" にトリガーのメッセージ ID を挿入することで返信することができます。 "返信" には先程の変数をそのまま置いてください。 f:id:jn-kodama:20200823000354p:plain


これで、完成です。


注意点

いくつか注意点を挙げておきます。

  • Teams の返信は本フロー作成者が返信する形になります。部の代表アカウントや専用アカウントが望ましいかもしれません。
  • 今回使用した "チャネルに新しいメッセージが追加されたとき(プレビュー)" のトリガーは3分周期監視のため(間隔はライセンスによって異なるかも)、即時返信されませんのでご了承ください。


おわりに

今回は、組織の連絡先のメールアドレスを Teams のチャネルに書き込むと、そのメールアドレスが含まれる配布グループの一覧を返信してくれる仕組みを Power Automate で作成してみました。

Graph API には様々な機能がありますが、Power Automate にはそれら Graph API の機能の一部が標準コネクタとして用意されています。
気になる機能を見つけた方は、まずは標準コネクタがないか探していただき、用意されていないものは今回のような方法で処理することを検討してみてください。



欲しいツールは欲しい人が作る時代へ。

ご参考になれば幸いです。


参考文献

idea.tostring.jp

docs.microsoft.com

docs.microsoft.com

docs.microsoft.com