Microsoft Entra ID 上の使用されていないユーザーを棚卸できるように、Graph API 経由でサインイン日時を取得して SharePoint リストに出力する Logic Apps を作成しました 。
Microsoft Graph API でサインイン日時を取得
Graph API でユーザーを取得する際、signInActivity を明示的に指定することでユーザーのサインイン日時を取得できます。
lastSignInDateTime(対話型サインイン)と lastNonInteractiveSignInDateTime(非対話型サインイン)の情報が取得できます。
正確なサインイン日時を知るためには両方のサインイン日時を考慮する必要がありますね。
サインイン日時以外にも、ユーザーの属性を取得してみます。
下記 URI では「表示名」「メール」「割り当て済みライセンス」「有効なアカウント」の情報を取得しています。
https://graph.microsoft.com/v1.0/users?$select=displayname,mail,signInActivity,assignedLicenses,accountEnabled
リストに出力する値を決めたところで、SharePoint リストを作成しておきます。
Logic Apps で Microsoft Graph API を実行
Logic Apps の HTTP コネクタで実行します。
認証の種類はマネージド ID を利用すると管理が楽ですし最もセキュアです。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3540101%2F2a8fe8f6-b87a-bd86-cd6a-f245dbbc91d8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=784ce2035e2e231dba189f490cc96af6)
SharePoint リストに出力する
続いて、取得した情報を SharePoint リストに出力する処理です。
リストにあるアイテムを取得
まず、「複数の項目の取得」アクションで SharePoint リストのアイテムを取得します。フィルタークエリで Graph API で取得した UserPrincipalName の値が入力されている行を取得します。
これは、このあとの処理の "リストに UserPrincipalName がない場合は行を追加、すでにある場合は項目を更新" するフローで使います。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3540101%2F8d1a6daa-fa32-3f7f-4df9-6e2094e4bc3a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b6f43653060c7fd9078f381426c5d8c3)
ライセンスの GUID をライセンス名に変換
assignedLicenses で取得したライセンス名は GUID で取得されるので、replace 関数を使って GUID をライセンス名に変換する処理を加えました。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3540101%2F49ef5d9d-1f08-45ba-7dd1-62eb1b3c32d8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=9c87368b5b50397fce400f8fceee6d56)
replace(replace(replace(string(item()?['skuId']),'05e9a617-0261-4cee-bb44-138d3ef5d965','M365 E3'),'06ebc4ee-1bb5-47dd-8120-11324bc54e06','M365 E5'),'f30db892-07e9-47e9-837c-80727f46fd3d','PowerBI Pro')
リストに UserPrincipalName がない場合は行を追加、すでにある場合は項目を更新
ユーザーのサインイン日時やライセンス、アカウントの有効状態の情報は更新されます。
そのため、リストに Graph API で取得したユーザー情報を新規で作成する処理とすでにある情報を更新する処理が必要です。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3540101%2Ffd3ef159-2a2f-2a75-0973-17e884565c83.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f78f2d096ea32b54a63c29d6bc7e0bca)
この例では、「条件」アクションで下記の length 関数を使って「複数の項目の取得」アクションの実行結果がない場合は、True(項目を作成)、ある場合は False(項目の更新)をする条件としています。
length(body('複数の項目の取得')?['value'])
Logic Apps を実行すると以下のようなリストが出来上がります。
リストができたら
たとえば長期間サインインがないユーザーの項目に色を付けて視覚的にわかりやすくしたり、リストからユーザーを削除するフローを取り入れることもできます。このような手法で、ユーザー棚卸作業を効率的に行うのはいかがでしょうか。