Microsoft Teams のチームに招いた社外のゲストを毎月洗い出し、最終利用日・所属・チームの用途から削除の候補を判定して、チームの所有者への確認依頼を送る
Teams のチームに招いた社外のゲストを毎月洗い出し、最終サインインの日時、所属する会社の取引の状態、チームの用途と終了予定から、ゲストとチームの組ごとに削除の候補かどうかを判定します。候補はチームの所有者に確認を頼みます。
- 生成AI
- Azure OpenAI Service/Claude
- 連携・自動化
- Make/n8n/Power Automate
- 対象業界
- IT・SaaS/広告/建設/製造
- 対象部門
- 情報システム
- 対象業務
- 内容確認・チェック/台帳・マスタ管理
- 主な課題
- 人手が足りない/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 判定
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- ノーコード連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月初に、Microsoft Entra 管理センターでゲストの一覧と最終サインインの日時を書き出す
- Teams 管理センターで、ゲストがいるチームと所有者を書き出す
- 2つの一覧をゲストのアドレスでつなぎ、ゲストとチームの組の表を作る
- 組ごとに、チームの名前と説明から案件が続いているかを推し量る
- ゲストのメールのドメインから、取引が続いている会社かを営業の一覧で調べる
- 気になる組を所有者ごとにまとめ、確認のメールを送る
- 返事を待ち、外してよいと言われたゲストをチームから外す
- 自動毎月1日の朝に、Power Automate のフローが動く
- 自動Microsoft Graph からテナントのユーザーと最終サインインを取り、ゲストに絞る
- 自動チームの台帳にある各チームのメンバーを取り、ゲストとチームの組の表を作る
- 自動ゲストのドメインを取引先の一覧で引き、取引の状態を付ける
- 自動経過日数・招待からの日数・チームの終了予定を規則で計算し、印を付ける
- 自動組ごとの事実を AI Builder のプロンプトに渡し、判定と理由を受け取る
- 自動判定が「確認」の組を所有者ごとにまとめ、Teams で確認のカードを送る
- 人所有者が組ごとに「残す/外してよい/分からない」を答える
- 人情報システムの担当が、「外してよい」の組をチームから外す
- 自動返事が無い所有者には、7日後に一度だけ催促を送る
各工程の詳しい説明を読む
- 月初に、Microsoft Entra 管理センターでゲストの一覧と最終サインインの日時を書き出す
- Teams 管理センターで、ゲストがいるチームと所有者を書き出す
- 2つの一覧をゲストのアドレスでつなぎ、ゲストとチームの組の表を作る
- 組ごとに、チームの名前と説明から案件が続いているかを推し量る
- ゲストのメールのドメインから、取引が続いている会社かを営業の一覧で調べる
- 気になる組を所有者ごとにまとめ、確認のメールを送る
- 返事を待ち、外してよいと言われたゲストをチームから外す
(a)組の表を作るだけで半日かかる。 2つの管理画面の一覧をつなぐ作業は、毎月同じ手順なのに手作業です。ゲストが複数のチームにいると、つなぎ方を誤りやすくなります。
(b)最終サインインを「チームを使った日」と読んでしまう。 管理センターの最終サインインは、テナントへのサインインの記録です。別のチームで毎日働いているゲストは、終わった案件のチームにも「使っている人」として残ります。
(c)判断の基準が担当者ごとに違う。 90日サインインしていなければ問い合わせる人、180日まで待つ人がいます。チームの説明を読んで案件が終わったと判断するかどうかも、人によって違います。
(d)所有者への確認が漏れる。 メールで問い合わせると、返事の無いものを追いかける手段がありません。返事の無い組は、翌月の表にそのまま残ります。
- 【自動】 毎月1日の朝に、Power Automate のフローが動く
- 【自動】 Microsoft Graph からテナントのユーザーと最終サインインを取り、ゲストに絞る
- 【自動】 チームの台帳にある各チームのメンバーを取り、ゲストとチームの組の表を作る
- 【自動】 ゲストのドメインを取引先の一覧で引き、取引の状態を付ける
- 【自動】 経過日数・招待からの日数・チームの終了予定を規則で計算し、印を付ける
- 【自動】 組ごとの事実を AI Builder のプロンプトに渡し、判定と理由を受け取る
- 【自動】 判定が「確認」の組を所有者ごとにまとめ、Teams で確認のカードを送る
- 【人】 所有者が組ごとに「残す/外してよい/分からない」を答える
- 【人】 情報システムの担当が、「外してよい」の組をチームから外す
- 【自動】 返事が無い所有者には、7日後に一度だけ催促を送る
8番目が、この設計の分かれ目です。 判定は所有者に聞くべきかを決めるためのもので、外すかどうかは所有者が決めます。 所有者が「分からない」と答えた組は、情報システムの担当が所有者と話して決めます。
9番目を自動にしないのは、外したあとで戻すのに手間がかかるからです。 ゲストをチームから外すのと、テナントからゲストのアカウントを消すのは別の作業で、後者は情報システムの担当が、そのゲストが他のチームに残っていないことを確かめてから行います。
02今回想定するシステム構成
Microsoft Entra ID(ユーザーと最終サインイン)/Teams(チームのメンバー) │ ▼【トリガー】毎月1日 7時の繰り返し Power Automate(クラウド フロー) ├──▶ HTTP with Microsoft Entra ID で Microsoft Graph を呼ぶ │ users(signInActivity、createdDateTime、userType) ├──▶ Teams コネクタでチームのメンバーを取る(チームの台帳の各チーム) ├──▶ 取引先の一覧でドメインを引く ├──▶ 経過日数と終了予定の印(フローの式) ├──▶ AI Builder のプロンプト(プロンプトを実行する) │ 組ごとに keep / ask_owner と理由を JSON で返す ├──▶ SharePoint のリスト(見直しの記録)に組ごとに1行 └──▶ 所有者ごとに Teams の確認のカード(返事を待つ) ▼ 【所有者が組ごとに答える】 ──▶ 見直しの記録へ ▼ 【情報システムの担当が「外してよい」の組を外す】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | Power Automate(クラウド フロー、HTTP with Microsoft Entra ID・Teams コネクタ) | Make、n8n |
| 生成AI | AI Builder のプロンプト(「プロンプトを実行する」アクション、JSON 出力) | Azure OpenAI(Microsoft Foundry)、Claude |
| 保管 | SharePoint のリスト(チームの台帳・取引先の一覧・見直しの記録) | Dataverse |
| 確認依頼 | Microsoft Teams の確認のカード | Outlook の承認メール |
新しく足すのは、フローと見直しの記録のリストです。 チームの台帳には、チームごとの用途(案件/共同研究/取引先の窓口/社内のみ)、所有者、終了予定日、相手先の会社の列を持たせます。台帳が無ければ、これを作るのが最初の準備作業です。
最終サインインは、Microsoft Graph のユーザーの signInActivity から読みます。 lastSuccessfulSignInDateTime は、対話型・非対話型を問わず最後に成功したサインインの日時で、実際に使われたかを見るにはこれを使うよう説明されています。lastSignInDateTime は失敗した試行も記録されるため、実際の利用を正しく表さないことがあるとされています。
読むには条件があります。 lastSuccessfulSignInDateTime を Graph で読むには Microsoft Entra ID P1 または P2 のライセンスが要り、アプリに AuditLog.Read.All と User.Read.All の権限が要るとされています。また、この項目は2023年12月1日から提供されたもので、それ以前の分はさかのぼって埋められていません。
Graph を呼ぶのは、HTTP with Microsoft Entra ID(preauthorized)コネクタです。 Power Automate ではプレミアムのコネクタで、「HTTP 要求を呼び出す」アクションで Graph に要求を送れます。接続には、証明書を使うアプリの資格情報で接続する方法と、サインインした利用者の権限で動く方法があります。利用者の権限で動かす場合は、必要なスコープをあらかじめ管理者が許可しておく必要があり、足りないと実行時に権限不足のエラーになるとされています。
Microsoft Entra ID Governance のライセンスがあるなら、アクセス レビューを先に検討してください。 公式の説明では、アクセス レビューで非アクティブなゲストを確認し、サインインを止め、テナントから削除するまでを回せます。この構成は、そのライセンスが無く、チームの用途に照らした判断を所有者に頼みたい場合のためのものです。
03どうやって実装するのか
処理の起点を決める
毎月1日の朝7時に、繰り返しのトリガーで動かします。 見直しは月に1回で足ります。ゲストの最終サインインの日時は、更新に最大24時間かかることがあるとされているので、日々の細かな動きを追う意味はありません。
所有者の返事を待つ期間は14日にします。 7日目に一度だけ催促し、14日を過ぎて返事の無い組は「返事なし」として情報システムの担当の一覧に入れます。翌月の見直しが始まる前に、前の月の組を閉じておくためです。 返事を待つ間もフローは止まったままになるので、待機の部分は所有者ごとの子フローに分け、親のフローは組の表と判定を作ったところで終えます。
チームの台帳の終了予定日が過ぎたチームは、月の途中でも見直しの対象にします。 終了予定日の翌日に、そのチームの組だけで同じ処理を動かす2つ目のフローを置きます。案件の終わりは、ゲストを外すいちばん自然な時機だからです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| ユーザー | 表示名、メール、userType、createdDateTime、signInActivity | Microsoft Graph |
| チームのメンバー | チームごとのメンバーとその役割 | Teams コネクタ |
| チームの台帳 | チームの ID、用途、所有者、終了予定日、相手先の会社、チームの説明 | SharePoint のリスト |
| 取引先の一覧 | 会社名、メールのドメイン、取引の状態(取引中/終了/不明) | SharePoint のリスト(営業の一覧から月1回写す) |
| 前回の見直し | 組ごとの前回の判定と所有者の答え | 見直しの記録 |
質を決めるのは、チームの台帳の終了予定日と、取引先の一覧の取引の状態です。 この2つが空だと、判定は最終サインインの日時だけに頼ることになり、第1章で書いた読み違えがそのまま判定に入ります。
前回の見直しの記録も渡します。 先月「残す」と答えた組をまた聞くと、所有者は確認のカードを開かなくなります。前回「残す」と答えた組は、状況が変わらない限り3か月は聞きません。
データの取得方法を決める
ユーザーは、signInActivity を選んで一覧で取ります。 公式の説明では、signInActivity は既定では返らないため、ユーザーの一覧を取るときに $select=signInActivity を指定する必要があります。
GET https://graph.microsoft.com/v1.0/users
?$select=id,displayName,mail,userType,createdDateTime,signInActivity
ゲストへの絞り込みは、取ったあとにフローの中で行います。 signInActivity は $filter に使えますが、他の項目との組み合わせのフィルターには対応していないとされています。userType の条件と signInActivity の条件を1回の要求にまとめず、userType が Guest のものをフローのフィルターで残します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| ゲストと最終サインイン | Graph の users | 経過日数の計算 |
| 招待の日時 | createdDateTime | サインインしたことの無いゲストの経過日数 |
| チームのメンバー | Teams コネクタのチームのメンバーの一覧 | ゲストとチームの組 |
| チームの用途と終了予定 | チームの台帳 | 案件が続いているか |
| ドメインの取引の状態 | 取引先の一覧 | 所属する会社との取引が続いているか |
チームのメンバーは、チームの台帳に載ったチームだけを取ります。 テナントのすべてのチームを回すと、台帳に用途の無いチームの組が大量に出ます。台帳に無いチームにゲストがいたら、それ自体を「台帳の漏れ」として情報システムの担当に知らせます。
AIへ渡す前に整形する
- ゲストに絞る …
userTypeがGuestのユーザーだけを残します - 経過日数を計算する …
lastSuccessfulSignInDateTimeから今日までの日数。空のときはcreatedDateTimeからの日数を使い、「サインイン記録なし」の印を付けます - 招待から日の浅いゲストを外す … 招待から30日以内のゲストは、判定の対象にしません
- ドメインを取り出す … メールの
@より後ろを取り、取引先の一覧で引きます - 終了予定の印を付ける … チームの終了予定日を過ぎていれば「終了予定を経過」の印を付けます
- 前回の答えを付ける … 前回の見直しで「残す」と答えた日を付けます
- 個人を特定する項目を落とす … プロンプトに渡す行から、表示名とメールの local part を落とします
2番目の「記録なし」を、長く使っていないことと同じに扱わないでください。 lastSuccessfulSignInDateTime は2023年12月1日より前の分がさかのぼって埋められておらず、招待されたまま一度も使われていないゲストも空になります。 空は空として、招待からの日数と組み合わせて判断させます。
3番目は、公式のアクセス レビューの考え方にも沿っています。 非アクティブの日数を決めても、それより最近に作られたユーザーは対象にしないとされており、招待したばかりのゲストが一度もサインインしないうちに消されることを防いでいます。
AIに処理させる
させるのは、ゲストとチームの組ごとに、所有者に確認を頼むべきかを判定し、その理由を所有者が読める文で書くことだけです。 数字の計算はフローで済ませ、プロンプトには結果だけを渡します。
| 渡すもの | 中身 |
|---|---|
| 最終サインインからの日数 | 数値。記録なしの印付き |
| 招待からの日数 | 数値 |
| チームの用途 | 案件/共同研究/取引先の窓口/社内のみ |
| チームの名前と説明 | 台帳と Teams の説明の文 |
| 終了予定の印 | 経過/未経過/未設定 |
| 所属の会社の取引の状態 | 取引中/終了/不明 |
| 相手先の会社との一致 | ゲストの会社がチームの相手先と同じか |
| 前回の答え | 残す(日付)/なし |
| 判定 | 意味 |
|---|---|
ask_owner | 所有者に確認を頼む |
keep | 今月は聞かない |
判定を2つに絞っているのは、「削除」をAIの選択肢に入れないためです。 AIに「削除」「保留」「継続」を選ばせると、「削除」が出た組がそのまま外されるという運用に流れていきます。 選べるのは「聞く」か「聞かない」かだけにします。
理由の文が、この構成の価値の半分です。 「最終サインインから142日。チームの終了予定日(2026年6月30日)を過ぎている。所属の会社との取引は続いている」と書かれていれば、所有者は、そのゲストが別の案件で使われていると分かったうえで答えられます。
| させないこと | 理由 |
|---|---|
| 外すかどうかの決定 | 所有者が決める |
| 日数の計算 | フローの式で行う |
| 取引の状態の推測 | 取引先の一覧に無ければ「不明」のまま |
| 個人の評価 | ゲストの働きぶりを判定の材料にしない |
指示内容を固定する
あなたは情報システム部で、Teams のチームに招いた社外のゲストの見直しを手伝う担当です。
以下はゲストとチームの組ごとの事実です。事実だけを見て、チームの所有者に
「このゲストをこのチームに残す必要があるか」を確認すべきかを判定してください。
【判定の選び方】
- ask_owner ... 次のどれかに当たる
・最終サインインから {inactive_days} 日以上
・サインインの記録が無く、招待から {inactive_days} 日以上
・チームの終了予定日を過ぎている
・所属の会社との取引が「終了」
・ゲストの会社が、チームの相手先の会社と違う
・チームの名前や説明から、案件や共同研究が終わったと読める
- keep ........ 上のどれにも当たらない
・ただし前回「残す」と答えてから 90 日以内で、状況が変わっていなければ keep
【厳守事項】
- 外すべきだ、削除すべきだ、とは書かないでください。判定は ask_owner か keep だけです。
- 最終サインインは、このテナントへのサインインの記録です。
このチームを使った日と書かないでください。
- 取引の状態が「不明」のときに、取引が終わったと推測しないでください。
- reasons には、当てはまった条件を所有者が読める短い文で、日付と日数を入れて書いてください。
- チームの説明から読み取ったことを理由にするときは、説明の文を quote にそのまま写してください。
- 回答に JSON マークダウンを含めないでください。
【組の事実】{pairs_json}
「このチームを使った日と書かないでください」を入れるのは、理由の文で読み違えを広げないためです。 AIは「142日このチームを使っていない」と書きがちで、所有者はそれを読んで「使っていないなら外してよい」と答えます。 実際には別のチームで毎日使っているかもしれません。
閾値を {inactive_days} で差し込むのは、社内で決める値だからです。 公式の説明では、多くの組織で非アクティブとみなす期間は90日から180日の間とされています。まず90日で始め、所有者の「残す」の答えが多すぎるなら延ばします。
pairs_json には、1つのチームの組をまとめて渡します。 1回の実行で1チームを判定すれば、チームの説明を何度も渡さずに済み、所有者ごとのカードもチーム単位で作れます。
出力形式を固定する
次の形の JSON で受け取ります。
{
"team_id": "",
"results": [
{
"guest_id": "",
"decision": "ask_owner",
"reasons": [
"最終サインインから 142 日(2026-05-19)",
"チームの終了予定日(2026-06-30)を過ぎている"
],
"quote": "",
"notes": "所属の会社との取引は続いている"
}
]
}
1つ目の理由は、guest_id で返すことです。 プロンプトには表示名を渡していないので、フローは Graph のユーザーの ID でゲストと結び直し、カードに表示名を出します。
2つ目は、reasons を配列にすることです。 確認のカードには理由を箇条書きで出し、見直しの記録には条件ごとに数えられる形で残します。 どの条件で聞いた組が「外してよい」になりやすいかが、数か月で分かります。
3つ目は、notes で「聞く理由ではないが知っておくべきこと」を分けることです。 取引が続いていることは聞く理由ではありませんが、所有者が答えるときには必要な情報です。
渡した組と返ってきた組の数が合わないときは、足りない組を ask_owner として扱います。 AIが組を1つ落としても、そのゲストが「聞かなくてよい」側に紛れ込まないようにするためです。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Microsoft Graph | HTTP with Microsoft Entra ID の HTTP 要求 | ユーザーと最終サインインを読む |
| Teams | Teams コネクタ | チームのメンバーを読む、確認のカードを送って返事を待つ |
| AI Builder のプロンプト | 「プロンプトを実行する」アクション | 組ごとの判定と理由 |
| SharePoint のリスト | 項目の作成・更新 | 見直しの記録 |
Graph へは読むだけで、書き込みません。 ゲストをチームから外す、アカウントを止める、といった操作はフローに持たせません。フローに書き込みの権限を渡さなければ、判定の誤りが外す操作に直結しません。
確認のカードは、Teams コネクタの「アダプティブ カードを投稿して応答を待機する」で、所有者とのフロー ボットのチャットに送ります。 コネクタの説明では、このアクションはどのユーザーの応答でも待機を終えるとされているので、チャネルに投稿すると、所有者でない人が答えてしまいます。 所有者個人のチャットに送ります。
カードの大きさには上限があります。 メッセージは約28KBが上限とされ、超えると失敗します。1枚のカードに載せるゲストは20人までにし、それを超えるチームはカードを分けます。 また、これらのアクションは Teams 管理センターで Workflows アプリが許可されている必要があります。
人が確認する
判定が ask_owner の組は、必ず所有者が答えます。
- 所有者が答える … 組ごとに「残す/外してよい/分からない」を選びます。「残す」には一言の理由を求めます
- 情報システムの担当が外す … 「外してよい」の組をチームから外します
- アカウントの削除は別に判断する … すべてのチームから外れたゲストについてだけ、テナントからの削除を検討します
- 「分からない」と「返事なし」を担当が引き取る … 所有者と話して決めます
カードには、組ごとに3つだけを載せます。 ゲストの表示名と会社、理由の箇条書き、3つの選択肢です。最終サインインの日時そのものは載せず、理由の文の中で「テナントへのサインイン」として示します。 日時だけを大きく見せると、所有者はそれだけで答えを決めてしまいます。
keep の組も、毎月1割を情報システムの担当が抜き取りで見ます。 判定の条件に漏れがないかを確かめるためで、チームの説明が空のチームの組から優先して見ます。
所有者が異動・退職していたら、台帳の所有者を直してから聞きます。 所有者がいないチームのゲストは、情報システムの担当が部署の長に確かめます。
例外に対処する
| 起きること | 対応 |
|---|---|
signInActivity が空 | 「記録なし」の印を付け、招待からの日数で判断させる |
| Graph が権限不足のエラーを返す | フローを止め、情報システムの担当へ。スコープの許可を確かめる |
| 台帳に無いチームにゲストがいる | 判定せず「台帳の漏れ」として担当へ |
| 所有者がいない・退職している | 判定はするが、カードは担当へ送る |
| カードが約28KBを超える | ゲストを20人ずつに分けて送る |
| 所有者が14日答えない | 「返事なし」として担当の一覧へ |
| 取引先の一覧にドメインが無い | 取引の状態を「不明」にする。推測しない |
| プロンプトが JSON を返さない | そのチームの組をすべて ask_owner 扱いで担当へ |
| 1人のゲストが多数のチームにいる | チームごとに判定し、外すのはチームごと |
| ゲストのメールが個人のフリーメール | 取引の状態を「不明」にし、所有者に所属を確かめてもらう |
最後から2行目で ask_owner 扱いにするのは、判定が出ないことを「聞かなくてよい」と扱わないためです。 誤るなら聞くほうへ誤らせます。
記録を残す
- 毎月の組の表(ゲストの ID、チームの ID、経過日数、印、取引の状態)
- プロンプトに渡した事実と、返ってきた JSON の全文
- 所有者に送ったカードの内容と送った日時
- 所有者の答えと理由、答えた日時
- 情報システムの担当が外した日時と、外した人
- テナントから削除したゲストと、削除を決めた理由
4つ目は、監査のときに「誰がなぜ残すと決めたか」を示す記録になります。 毎月見直しているという規程を守っていることも、この記録で示せます。
5つ目と6つ目を分けて残すのは、チームから外すこととテナントから消すことが別の判断だからです。 後から「なぜこのゲストのアカウントが無いのか」と聞かれたときに、どのチームの所有者の答えを根拠に、誰が消したかを追えるようにします。
keep の抜き取りの結果も残します。 抜き取りで見つかった「聞くべきだった組」は、プロンプトの条件を足す材料になります。
04実装レベルの3段階
本記事の想定は本格構成です。 半自動化では、判定の一覧から所有者に問い合わせる作業が人に残り、1件4分が2分程度です。確認のカードと答えの回収まで自動にして、1分になります。 半自動化を1〜2か月回してから進んでください。 判定の一覧を担当が見て、聞く必要の無い組が多すぎないかを先に確かめます。多すぎるまま所有者にカードを送ると、所有者はカードを読まずに「残す」を押すようになります。
05工数削減シミュレーション
導入後 600件 × 1分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 取引先・協力会社・制作会社などを Microsoft Teams のチームにゲストとして招いて仕事を進めている企業で、チームの数が数十〜数百あり、情報システム部門がゲストの棚卸しを毎月手作業で行っている場合。Microsoft Entra ID P1 以上のライセンスがあり、ゲストの最終サインインの日時を読める場合。チームごとの用途と所有者を一覧で持てる場合。
- ゲストを招いているチームが数個で、所有者が自分で管理できている場合。Microsoft Entra ID Governance のライセンスがあり、アクセス レビューで非アクティブなゲストの確認と削除を回せる場合(そちらの機能を先に使う)。Microsoft Entra ID P1 以上のライセンスが無く、最終サインインの日時を API で読めない場合。なお、ゲストを残すか外すかの最終判断と、取引の終了の判断は、この構成では代替できません。
07最小構成で試す方法
- Microsoft Entra 管理センターで、ゲストの一覧に最終サインインの列を足して書き出す
- ゲストがいるチームを10個選び、メンバーと所有者を書き出す
- 10チームの用途と終了予定を、所有者に聞いて表にする
- 組ごとの事実を手元のAIサービスに渡し、第7章のプロンプトで判定と理由を出させる
- その判定を、所有者に実際に見せて「この理由なら答えられるか」を聞く
見るのは、判定の当たり外れより、理由の文が所有者に伝わるかです。
| 出てきた内容 | 判断 |
|---|---|
| 所有者が理由を読んで迷わず答えられた | フローを組む段階に進む |
| 理由に「このチームを使っていない」と書かれた | 指示の書き方で直る。構成は有効 |
| 用途と終了予定が空のチームが多い | チームの台帳の整備が先 |
3行目は珍しくありません。 その場合は、チームの台帳を作ることが、この構成の最初の成果になります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 最終サインインを「チームを使った日」と読む | テナントへのサインインと明記し、用途と終了予定を組み合わせる |
signInActivity が返らない | $select=signInActivity を指定する |
userType と組み合わせたフィルターが失敗する | ゲストへの絞り込みはフローで行う |
| 最終サインインが空のゲストを長期未使用と扱う | 「記録なし」として招待からの日数で見る |
| 招待したばかりのゲストが候補に出る | 招待から30日以内を外す |
| 権限不足のエラーになる | 必要なスコープの許可を確かめる |
| チャネルに送ったカードに他の人が答える | 所有者個人のチャットに送る |
| カードが大きすぎて失敗する | ゲストを20人ずつに分ける |
| 所有者が毎月同じ組に「残す」と答える | 前回「残す」から90日は聞かない |
| 判定がそのまま削除に使われる | 判定は「聞く/聞かない」だけにする |
上の4行が、この構成の失敗のほとんどです。 どれも、最終サインインという1つの値を、見た目どおりに読んでしまうことから出ています。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 社外のゲストの氏名・メールアドレス・最終サインインの日時、チームの名前と説明、取引先との取引の状態です。サインインの記録は、個人の行動の記録でもあります。
- プロンプトに個人を特定する項目を渡さない … 判定に名前は要りません。ゲストは ID とドメインで渡し、表示名はフローの側でカードに付けます
- データが処理される地域を確かめる … 公式の一覧では、日本のリージョンで GPT-4.1 mini などのモデルが「GA(クロスジオ)」とされ、クロスジオと示されたモデルはリージョン外でデータを処理する可能性があるとされています。チームの説明に取引の内容が書かれていることがあるので、渡してよいかを先に決めてください
- フローの資格情報に書き込みの権限を持たせない … 読む権限だけにし、外す作業は担当者の権限で行います
- 自動で外さない … 判定の誤りで取引先の仕事を止めないためです
- 最終サインインを個人の評価に使わない … 見直しの記録を、ゲストや所有者の働きぶりの評価に転用しません
- 見直しの記録の閲覧を限る … 情報システム部と監査の担当だけが開けるようにします
誤りが起きた場合のリスクは、外すべきゲストが残り続けることと、必要なゲストを外してしまうことの2つです。 前者は「迷ったら聞く」と抜き取りで、後者は所有者の答えと人の作業で防ぎます。
10まず何から始めるか
1週目:チームの台帳を作る
ゲストを招いているチームを書き出し、用途・所有者・終了予定日・相手先の会社の列を持つ台帳を SharePoint のリストに作ります。空欄は所有者に聞いて埋めます。
2週目:10チームで試す
第8章のとおり、手元のAIサービスで判定と理由を出させ、所有者に見せます。理由の文で所有者が迷わず答えられるかを最優先で見ます。
3週目:権限と閾値を決める
Graph のスコープの許可、フローを動かす資格情報、非アクティブとみなす日数を、情報システム部の責任者と決めます。 あわせて、Microsoft Entra ID Governance のアクセス レビューを使えるライセンスがあるかも確かめます。
4週目:洗い出しと判定の一覧を出す
Graph とチームのメンバーを取り、組の表と判定の一覧を担当に出すところまで作ります。この時点では所有者にカードを送らず、担当が一覧を見て聞く件数が妥当かを確かめます。
2か月目: 所有者ごとの確認のカードと催促を足し、答えを見直しの記録に残します。3か月目以降: 終了予定日の翌日の見直しを足し、条件ごとに「外してよい」になった割合を数えます。返事の無い組が毎月の見直しの終わりに残らなくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
signInActivity の lastSuccessfulSignInDateTime が対話型・非対話型を問わない最後の成功したサインインの日時で、実際に使われたかを見るのに使うよう示されていること。lastSignInDateTime は失敗した試行も記録するため実際の利用を正しく表さないことがあること。lastSuccessfulSignInDateTime は2023年12月1日から提供され、さかのぼって埋められていないこと | Microsoft Graph: signInActivity resource type | 2026-10-08 |
lastSuccessfulSignInDateTime を読むのに Microsoft Entra ID P1 または P2 のライセンスと、AuditLog.Read.All・User.Read.All の権限が要ること。signInActivity は既定で返らず $select か $filter の指定が要ること、他の項目と組み合わせたフィルターに対応していないこと。最終サインインの更新に最大24時間かかりうること。非アクティブの期間を90日から180日とする組織が多いこと | Microsoft Learn: How to manage inactive user accounts | 2026-10-08 |
| アクセス レビューで非アクティブなゲストを確認し、サインインを止め、削除できること。その利用に Microsoft Entra ID Governance または Microsoft Entra Suite のライセンスが要ること。非アクティブの日数より最近に作られたユーザーは対象にならないこと | Microsoft Learn: Monitor and clean up stale guest accounts | 2026-10-08 |
| HTTP with Microsoft Entra ID(preauthorized)コネクタが Power Automate でプレミアムであり、「Invoke an HTTP request」アクションを持つこと。接続に証明書を使う方法があること。必要なスコープが許可されていないと実行時に権限不足のエラーになること | Microsoft Learn: HTTP with Microsoft Entra ID (preauthorized) | 2026-10-08 |
| Teams コネクタの「アダプティブ カードを投稿して応答を待機する」がどのユーザーの応答でも待機を終えること。メッセージの上限が約28KBであること。Workflows アプリが Teams 管理センターで許可されている必要があること。チームのメンバーを一覧するアクションがあること | Microsoft Learn: Microsoft Teams connector | 2026-10-08 |
| フローの中で「プロンプトを実行する」アクションでプロンプトを使えること。Azure OpenAI サービスを活用した GPT モデルで動き、一部の地域に限定され、使用制限の対象になる場合があること | Microsoft Learn: Power Automate でプロンプトを使用する | 2026-10-08 |
| プロンプトの出力を JSON にでき、保存した形式が実行時に使われること。JSON の生成に失敗するときは「回答に JSON マークダウンを含めないでください」を加える対策が示されていること | Microsoft Learn: JSON 出力 | 2026-10-08 |
| 日本で GPT-4.1 mini などが「GA(クロスジオ)」とされ、クロスジオのモデルはリージョン外でデータを処理する可能性があること | Microsoft Learn: リージョンと更新プログラムによるモデルの可用性 | 2026-10-08 |
ライセンスの要否と、Graph のスコープの許可の手順は、自社の契約と管理者に確かめてください。 本記事は公式の説明で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0945)についてのご相談はこちらから。
