人事から通達もこない従業員のアカウントが無効化されてないと人事部門から連絡がきていらっときたので(笑)
人事がフォームに入力したデータをもとに自動的にOffice 365アカウントの無効化をするように設定してみました。
これで人事からの連絡がないから無効化されてないんだぞ!っていえるぞ(笑)
まぁ実際には優しく対応してますよ(笑)
それではいってみましょー!
GraphAPIを利用とタイトルにありますが、コードは一切書かずに実現可能です。
SharePoint Onlineにリストを作成する
以下のような列を持ったリストを「退職休職者情報」という名前で作成します。
項目名 | 種類 | 必須 | 備考 |
氏名 | ユーザーまたはグループ | 〇 | |
最終出社日 | 日付と時刻 | 〇 | 内部名をlasthiredateとしています |
退職日 | 日付と時刻 | ||
種別 | 1行テキスト | 〇 | 退職・休職をわかりやすくするために利用 |
flg | 1行テキスト | 〇 | Microsoft Flowで処理対象かの判別に利用 1なら処理対象レコード |
CreateUser | ユーザーまたはグループ | 〇 | 登録した人事担当者の名前を取得しておく項目 |
こんな感じになりますね
MS Formsを利用して入力フォームを作成する
ここはPowerAppsにしたほうがいいと思いなおしたので変更!
なぜかというと退職休職者ということは入社時に必ずメールアドレスを発行しています。
メールアドレスを基に処理を進めるため実際に登録されているメールアドレスを正確にもってこれるプラットフォームとしてはPowerAppsが最適かと思います。
Formsでもいいのですが、手入力する際に記載ミスをする可能性があり、記載ミスをした場合処理がエラーになります。
PowerAppsでSPOリストに登録するアプリを作成しよう!
こんな感じのアプリを作成してみました。
Office365のユーザーを検索して、氏名や部署名を表示、確定ボタンを押すと先ほど作成したSPOのリストに登録されるっていうだけのアプリです。
PowerAppsの新しい画面の追加に「人々」というのがあるのでその画面を追加すると簡単にできます。
このアプリ作成を説明するとそれだけで1記事以上の時間かかるので割愛します。
SPOリストに登録できればFormsからでもなんでもOKです
2019/02/16追記
Hiro #PowerAddictさんがアプリ作成動画を公開してくれました!(ありがとうございます!!)
このとおりにやればリスト登録アプリは作成できます!
AzureADにアプリを登録する
GraphAPIを利用してユーザ情報にアクセスするためAzureADにアプリを登録し管理者アカウントでアクセス許可の同意作業が必要になります。
- AAD管理センターを開きます
- 左ペインから「Azure Active Directory」をクリックします
- 【アプリの登録(プレビュー)】をクリックします
- 【新規登録】をクリックします
- 必要な項目を入力し、【登録】をクリックします
以下のように今回は設定しました名前 MSGraphAPIFlow サポートされているアカウントの種類 この組織のディレクトリ内のアカウントのみ リダイレクトURI https://login.microsoftonline.com - 登録が完了すると以下のような画面になります
- 【APIアクセス許可の表示】をクリックします
- 【アクセス許可の追加】をクリックします
- 【Microsoft Graph】をクリックします
- 【アプリケーションの許可】をクリックします
- 以下の権限が必要になるため、検索しアクセス権限を与え、【アクセス許可の追加】をクリックします
パーミッション アプリケーションのアクセス許可 User.ReadAll Read all users’ full profiles User.ReadWrite.All Read and write all users’ full profiles Directory.Read.All Read directory data Directory.ReadWrite.All Read and write directory data - 「管理者の同意が必要」が”はい”となっているので管理者の同意を与えます。
同意する下にある「~に管理者の同意を与えます」がクリックできる場合には、こちらのボタンをクリックします
- 問題なければ【はい】をクリックします
- アイコンがに変更されたことを確認します
管理者の同意を与えますボタンが押せない場合
自分が試していた時はこのボタンがなぜか押せず以下の手順で権限を付与しました。
- 登録したアプリの概要を表示させます
- アプリのクライアントIDをコピーします
- 以下のURLの末尾に先ほどコピーしたクライアントIDをつなげたURLへアクセスします。
https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&prompt=admin_consent&client_id=<<クライアントID>>実際のURL例としては、https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&prompt=admin_consent&client_id=51abxxxxx-xxx-xxxx-xxxx-xxxxx - サインイン画面が表示されるので、Office365全体管理者でログインします
- アクセス許可の確認画面が表示されるので、Permissionを確認し問題なければ【承諾】をクリックします
承諾完了後同様にAPIのアクセス許可設定画面を表示し、管理者の同意が完了していることを確認します
シークレットキーを発行する
この後のFlow設定のためにアプリのシークレットキーを発行し保管しておきます
- 【証明書とシークレット】をクリックします
- 【新しいクライアントシークレット】をクリックします
- 説明欄に識別するための名前を入力し、有効期限を「なし」にして【追加】をクリックします
有効期限等はセキュリティーポリシー等を確認の上設定することをお勧めします
- 表示されたシークレットキーをコピーし保存します
このページから移動してしまうと二度と表示することはできないため、必ず保存してください
Microsoft Flowを使ってフローを作成する
事前準備が整ったのでFlowを使って処理フローを作成していきます。
スケジュール設定
毎日朝1時に実行されるようにスケジュールフローを追加します
- フローを一から作成します
- Flowの検索ボックスに「スケジュール」と入力し検索し、【繰り返し】をクリックします
- 間隔を「1」とし、頻度を「日」にし、【詳細オプションを表示する】をクリックします
詳細表示された項目は以下のように設定しました。このあたりはお好みで他のバッチ処理と重複しない時間等にするなど適宜変更してくださいタイムゾーン (UTC+09:00)大阪、札幌、東京 設定時刻(時間) 1 設定時刻(分) 00 - 【新しいステップ】をクリックします
SPOリストから項目を取得
次にSPOリストから処理対象項目を取得します
- SharePointをクリックします
- 【複数の項目の取得】をクリックします
- サイトアドレスを入力し、リストを選択します
- 【詳細オプションを表示する】をクリックします
- フィルタークエリに抽出条件を記載します
今回は最終出社日から1日経過していることかつ(and) flg が1であることとしました
下記の数式を入力します
lasthiredate lt ‘@{addDays(utcNow(),-1,’yyyy-MM-ddTHH:mm:ssZ’)}’ and flg eq ‘1’
なんでflgをboolean型にしなかったんだ!って言われそうですが、PowerAppsからPatch関数で登録するときに面倒だったので文字列で作っちゃいました(笑) - 【新しいステップ】をクリックします
HTTPでGrapAPIを実行させる
取得した項目を利用してGraphAPIを実行させます
- Flowの検索ボックスにApplyと入力します
- 【Apply to each】をクリックします
- 動的なコンテンツの追加から【value】をクリックします
- 【アクションの追加】をクリックします
- Flowの検索ボックスにHTTPと入力します
- 【HTTP】をクリックします
- 今回アカウントを無効化処理を実行するため方法は「PATCH」を選択します。
Microsoft GraphAPIリファレンスを参照してやりたいことのAPIリクエスト方法を確認します
今回のはこちらです。
https://docs.microsoft.com/ja-jp/graph/api/user-update?view=graph-rest-1.0
- URIに以下のように入力します。
https://graph.microsoft.com/v1.0/users/ - リファレンスを見るとわかりますが、ユーザーの更新には上のURLのあとにuserPrincipalNameを付与する必要があります
URIの末尾にカーソルをおき、「動的なコンテンツの追加」→「もっと見る」→【氏名.Email】をクリックします
以下の画像のようになっていればOKです
- ヘッダーは下記のとおりに入力します
Enterキー 値の入力 Content-Type application/json - 本文には下記内容を入力します
{ "accountEnabled": false }
- 【詳細オプションを表示する】をクリックします
- 認証を「Active Directory OAuth」に設定します
- 各項目を以下のように入力していきます
テナント Azure Active DirectoryのテナントID(登録したアプリの概要に表示されています) 対象ユーザ https://graph.microsoft.com クライアントID 登録したアプリの概要に表示されているクライアントID 資格情報の種類 シークレット シークレット 前項で保管したシークレットキーを入力 - 【アクションの追加】をクリックします
これでGraphAPIが実行され該当ユーザのOffice365のアカウントが無効になります
処理したSPOリスト項目を更新する
この状態だと毎日1時にSPOをリスト確認し、再度アカウントを無効にするためにAPIアクセスが発行されてしまいます。
Flowで処理した項目をわかりやすくするためにもフラグを変更し、次回のFlow実行時には対象外とするように値を変更します。
ステータスコードを確認し、対応が完了した項目のみフラグを変更すうようにします。
リファレンスを見ると、HTTPステータスコード204が応答されるようなのでHTTPステータスコードが204のときのみ処理を実行するように制御します
- 「制御」→【条件】をクリックします
- 値にカーソルをあわせ動的なコンテンツの追加から「HTTP」→【状態コード】をクリックします
- 「次の値に等しい」を選択し、値に「204」と入力します
- 「はいの場合」欄の【アクションの追加】をクリックします
- 【SharePoint】をクリックします
- 【項目の更新】をクリックします
- 「サイトのアドレス」にSPOサイトURLを入力し、リストから「退職休職者情報」を選択します
- 「ID」欄にカーソルをあわせ、動的なコンテンツの追加から「複数の項目の取得」→【ID】をクリックします
- 各項目を以下のように入力していきます。
必須項目以外は入力しなくてもいい気はしますが今回はすべていれておきます。タイトル 処理完了 titleは必須項目なので適当に入れてしまいます 最終出社日 最終出社日 動的なコンテンツの追加「複数の項目の取得」→「最終出社日」をクリック flg 0 退職日 退職日 動的なコンテンツの追加「複数の項目の取得」→「退職日」をクリック 氏名 氏名 Claims 動的なコンテンツの追加「複数の項目の取得」→「氏名 Claims」をクリック 種別 種別 動的なコンテンツの追加「複数の項目の取得」→「種別」をクリック - 【アクションの追加】をクリックします
完了メール送信
処理が完了したらメールで飛ばすようにします。
ここはTeamsのWebHookとかでもいいかもしれませんね。
- コネクタとアクションを検索の検索ボックス欄に「メール」と入力します
- Offce365 Outlookの【メールの送信】をクリックします
- 必要項目を入力してきます
宛先 完了メールを送信する宛先 件名 メールの件名「退職級処理者自動処理結果」等お好きな件名を入力 本文 「氏名.DisplayName」さんのアカウントを無効化しました - フローに名前をつけ【保存】をクリックします
フローをテストする
フローが正常に動作するかをテストします
- 作成したSPOリストにテストデータを登録します。
- 最終出社日はテストしている日付の1日前以上に設定します
2019/02/11にテストしているなら、2019/02/10以前に設定 - フローの【テスト】ボタンをクリックします
- 「トリガーアクションを実行する」を選択し、【保存&テスト】をクリックします
- 【フローの実行】をクリックします
- 【完了】をクリックします
- フローの実行状況が表示されます
- 項目の取得条件に一致したレコードがあれば処理が流れていき、API実行も正常に完了するとフローは下記のように処理が完了します
対象アカウントが無効化されたか確認する
AzureAD管理センターからでもMicrosoft365管理センターのどちらかで該当ユーザのサインインがブロックされていることを確認します。
今回はMicrosft 365管理センターのユーザで確認しました。
- Microsoft 365管理センターを開きます
- 対象アカウントを検索しプロパティを表示します
- サインインの状態が「サインインが禁止されている」となっていることを確認できたら成功です!
- メールでも処理結果が下記のような形で届いています
- SPOリスト側のflgも0に変更されているため、次の処理では処理対象にならず無駄にAPIを呼び出すこともありませんね
まとめ
FlowからGraphAPIを簡単に呼び出せるのでとても便利ですね!
今回失敗したときの処理追加をしていないですが、失敗したときの処理を追加し失敗した対象アカウントは手動で処理する等の運用フローを組み込んだほうがいいですね。
配布グループの解除もやりたいのですが、Office365グループしか対応してない?感じなのですが配布グループでも対応できるのでしょうか?
また、Azure Automationと組み合わせることでできるのではないかと思うのですが、AADConnectでオンプレミスADと同期させている場合にオンプレミス側ADも停止させる等ができるとほぼほぼ自動化できるのではないかと思います。
そのあたりもテストできたら記事に追加したいと思います。