📝

Entra ID管理者に捧ぐユーザー情報を取得するコマンドチートシート

2024/09/13に公開

はじめに

こんにちは。株式会社IVRy(アイブリー)のコーポレートエンジニアのueda(chama)です。

いわゆるゼロトラストモデルな社内ITを構築するためにはID管理やSingle Sign-On(SSO)、SAMLに対応したIDaaSがもっとも重要で、IVRyではMicrosoft Entra IDを採用しています。
管理者がEntra IDを操作する手段はいくつかありますが、Webブラウザで管理センターからポチポチするのが面倒になってきた方がまず行き着くのはPowerShell(Microsoft Graph PowerShell)なのではないかと思います。

ただ、PowerShellを普段から使っていないとコマンドをすぐ忘れちゃいますよね。ググる->思い出す->試す->手元にメモする、を最近私も繰り返しました。
今回は私自身の備忘も兼ねて、運用でよく使うであろうユーザー情報の参照系コマンドを、チートシートのようにまとめてみようと思います。コピペですぐ使えるワンライナーのみです!

(Macのみ)PowerShellをインストールする

Windowsをお使いの方は読み飛ばしてください。
MacにはPowerShellがインストールされていないため、Homebrewを使ってインストールします。最新の安定版リリースをインストールするには、以下のコマンドを実行します。
なお、Homebrew自体のインストールは公式サイトなどを参照してください。

brew tap powershell/tap
brew install powershell/tap/powershell

tapコマンドの補足です。これは特定のリポジトリから直接ソフトウェアをインストールするためのものです。上記はMicrosoft社が管理するリポジトリをインストールしています。

インストール完了後に正常に動作するか確認するために pwsh と入力します。バージョンが表示された後、PowerShellのコンソールが表示されます。

コンソールから抜ける場合は exit と入力します。

Entra IDに接続する

PowerShellを使ってEntra IDにはじめて接続するときはまずモジュールをインストールします。

Import-Module Microsoft.Graph

次にEntra IDに接続します。この際、Entra IDの操作に必要なスコープを定義する必要があります。
後述するコマンドはユーザー情報を閲覧できれば十分です。過剰にならないように注意しましょう。
なお、この操作はPowerShellコンソールを開くたびに必要です。

Connect-MgGraph -Scopes "User.Read.All"

このコマンドを実行すると、WebブラウザでEntra IDのログイン画面が表示される場合があります。画面表示に従ってログインしましょう。

ユーザー属性の名称を確認する

この先で紹介するコマンドではさまざまなユーザーの属性を使ってフィルターをかけます。どんな属性があるのか確認したい場合はMicrosoft Learnを参照しましょう。
もしくは以下のコマンドの結果を確認するという方法もあります。

Get-MgUser -All | Get-Member

このようにズラズラとすべての属性が表示されます。

ユーザー一覧を取得する

Entra ID内のすべてのユーザーのリストを返して、デフォルトの属性を表示するには、以下のコマンドを実行します。DisplayNameを使ってソートしていますが、お好みで変えてOKです。

Get-MgUser -All -Sort "DisplayName"

結果はテーブル形式で表示されます。DisplayName、Id、Mail、UserPrincipalNameがデフォルトで表示される属性です。

デフォルトの属性以外を表示したいならGet-MgUserをSelect-Object にパイプします。
以下のコマンドではDisplayName、UserPrincipalName、CompanyName、UsageLocationを返します。 CompanyNameとUsageLocationはデフォルトの属性に含まれないものです。

Get-MgUser -All -Property DisplayName, UserPrincipalName, CompanyName, UsageLocation -Sort "DisplayName" | Select-Object DisplayName, UserPrincipalName, CompanyName, UsageLocation

特定の1人のユーザーの情報を取得する

実行結果として表示されたIDの値を使って1人のユーザーの情報だけ返すコマンドが以下です。
{Id}の部分は適宜置き換えてください。なお、このケースではIdではなくUserPrincipalNameを入力しても同じ結果になります。

Get-MgUser -UserId "{Id}"

実行結果はこのようになります。

テーブルではなくリストで属性情報をすべて取得する場合は、Format-Listを追加します。

Get-MgUser -UserId "{Id}" | Format-List

結果はこのように表示されます。すべての属性が表示されるのでかなり長いです。

ちょっと応用して、特定のユーザーのサインインアクティビティを取得します。このケースではUserIdにUserPrincipalNameを与えるとエラーになります。Idを渡しましょう。

Get-MgUser -UserId "{Id}" -Property SignInActivity | Select-Object -ExpandProperty SignInActivity | Format-List

マスクしていてわかりづらいですが、秒単位でサインインの記録が表示されます。

特定の条件を満たすユーザーの一覧を取得する

特定の条件を満たすユーザーだけ表示したい場合は -Filter を使います。
以下はユーザー種別を条件に検索する例です。{userType}はMemberやGuestに置き換えてください。
なお、Filterで使える演算子はeq、and、orです。

Get-MgUser -All -Filter "userType eq '{userType}'"

次の例では特定の会社のユーザーの一覧を出力するために -Search を使います。グループ会社のユーザーだけ表示したい場合などに便利です。

Get-MgUser -All -Search "CompanyName:{CompanyName}" -Property ID, DisplayName, UserPrincipalName, CompanyName -ConsistencyLevel eventual | Select-Object ID, DisplayName, UserPrincipalName, CompanyName

とある属性が特定の文字で終わるユーザーだけ表示したい場合は endWith を組み合わせます(逆に特定の文字で始まるユーザーなら startWith)。
以下はUserPrincipalNameに特定のドメインを含むユーザーだけ出力する例です。

Get-MgUser -All -Filter "endsWith(UserPrincipalName, '{Domain}')-ConsistencyLevel eventual -Count userCount

ConsistencyLevel の補足です。このパラメーターはEntra IDからデータを取得する結果の整合性を指定します。 eventual は最新データであることを保証しない代わりに、応答時間を短縮できます。基本的にeventualを指定すればOKで、必ず最新データを取得したい場合は strong を指定します(なお、なにも指定しない場合のデフォルトはstrong)。

有効なユーザーの一覧を取得する

基本は以下のとおりです。AccountEnabledはデフォルトで表示される属性ではないので、先ほどと同じようにSelect-Object にパイプします。

Get-MgUser -All -Filter "accountEnabled eq true" -Property Id, DisplayName, UserPrincipalName, AccountEnabled | Select-Object Id, DisplayName, UserPrincipalName, AccountEnabled

逆に無効なユーザーのみ表示する場合は次のようなコマンドになります。演算子neを使う場合、CountVariable を追加する必要があるようです。

Get-MgUser -All -Filter "accountEnabled ne true" -ConsistencyLevel eventual -CountVariable CountVar -Property Id, DisplayName, UserPrincipalName, AccountEnabled | Select-Object Id, DisplayName, UserPrincipalName, AccountEnabled

ライセンスを付与したユーザーの一覧を取得する

以下のとおりです。
なお、ne 0eq 0 に置き換えると、ライセンスが付与されていないユーザー一覧になります。

Get-MgUser -All -Filter "assignedLicenses/`$count ne 0 and userType eq 'Member'" -ConsistencyLevel eventual -CountVariable Records

特定のユーザーにどのライセンスを付与しているか確認したい場合、たとえば Get-MgUserLicenseDetail というコマンドレットを使います。

Get-MgUserLicenseDetail -UserId {Id} -Property SkuPartNumber | Select-Object SkuPartNumber

結果は以下のようになります。このユーザーはEnterprise Mobility + SecurityとOffice 365のライセンスが付与されていることがわかります。

特定の条件を満たすユーザーの数を取得する

Countパラメーターを使用します。
たとえば以下の例ではゲストを除くメンバーの数を取得します。

(Get-MgUser -All -Filter "userType eq 'Member'" -ConsistencyLevel eventual).Count

マスクしている部分に条件に一致したユーザーの数が表示されています。

取得した結果をCSVにエクスポートする

Export-Csvにパイプで渡すだけです。
たとえば全ユーザーの一覧をエクスポートする場合は以下のようになります。{Path}は実際の保存場所に置き換えてください。ファイル名(hoge.csv)まで書くのを忘れないようにしましょう。

Get-MgUser -All -Sort "DisplayName" | Export-Csv -Path {Path}

Get-Mguserコマンドレットの構文を確認する

Get-MgUserコマンドレットのすべての構文を確認するには以下コマンドを実行します。 この記事で紹介した以外にやりたいことがある場合、まずGet-MgUserコマンドレットの実行結果からなにができるのか確認することをおすすめします。

(Get-Help Get-MgUser).syntax

結果は以下のように表示されます。
New-MgUserUpdate-MgUser など、他のコマンドレットでも同じように使えます。

おまけ: ユーザーを一括で作成する/変更する

ユーザーを一括で作成、あるいは変更するスクリプトはMicrosoft Learnで紹介されています。ほぼコピペで動作するので参考にするとよいのではないかと思います。
なお、ユーザーの一括変更は管理センターの操作では実現できません!
https://learn.microsoft.com/ja-jp/entra/identity/users/users-bulk-add
https://learn.microsoft.com/ja-jp/microsoft-365/enterprise/configure-user-account-properties-with-microsoft-365-powershell?view=o365-worldwide

まとめ

自分のためのメモも兼ねて、Entra IDのユーザー情報を取得するPowerShellコマンドをいろいろとご紹介してみました。特にEntra IDやPowerShellにあまり馴染みが無い方の一助になったら幸いです 🤟

そして、株式会社IVRyでは現在全方位で積極採用中です。もしすこしでもご興味を持っていただけたら、まずは以下のサイトも眺めてみていただけるとうれしいです!
https://ivry-jp.notion.site/IVRy-e1d47e4a79ba4f9d8a891fc938e02271

IVRyテックブログ

Discussion