〽️

コマンドを使ってMicrosft365のアドレス帳を取得する(Graph版)

2024/08/30に公開

これはなに?

PowershellのGet-MgUserを使ってMicrosft365のアドレス帳を取得する方法です。

概要

Microsft365のアドレス帳の内容はAzureADの登録ユーザ一覧と同じなので、AzureADのユーザ一覧を取得します。

モジュールのインストール

WindowsパソコンにMicrosoft.Graphをインストールします。

Install-Module Microsoft.Graph

コマンド実行

Connect-MgGraphコマンドでM365に接続します。
今回は情報を取得するのみなのでScopesでUser.Read.Allを指定します。

Connect-MgGraph -Scopes 'User.Read.All' -NoWelcome

コマンドを実行すると自動的にウェブブラウザが起動して、Windowsログイン中のユーザで認証が行われます。
過去にログインしたことがあってキャッシュが残っている場合は何も出力されないようです。

実際にユーザ一覧を取得してみます。

Get-MgUser

AzureADに登録されているユーザが一覧で表示されたはずです。

フィルターしよう

Get-MgUserを実行すると大量のユーザが表示されます。
最終的にはWhere-Objectを使ってフィルタしますがGet-MgUserの段階である程度フィルタしておくと動作が早いです。

フィルター例

AzureADには一般ユーザだけでなくメーリングリストやゲストユーザ、通知用メールアドレスなど様々なアドレスが登録されています。

今回は一般ユーザかつ指定部署のユーザを抽出したいため下記のフィルターを適用します。

Get-MgUser -CountVariable CountVar -ConsistencyLevel eventual `
           -Property userType, Mail, DisplayName, Department `
           -Filter "userType eq 'Member' and startswith(department,'部署名')"

フィルタした結果からさらにWhere-Objectでフィルタし、必要な項目をSelect-Objectで抽出します。

Get-MgUser -CountVariable CountVar -ConsistencyLevel eventual `
    -Property userType, Mail, DisplayName,Department, JobTitle `
    -Filter "userType eq 'Member' and startswith(Department, '部署名')" |
Where-Object { $_.jobTitle -notmatch "アラート通知用" } |
Select-Object mail, DisplayName, Department
  • jobTitleに "アラート通知用"と入っているアカウントを除外
  • mail, DisplayName, Department項目を取得

フィルターに使えるクエリ

Get-MgUser-Filter特定の項目についてのみeqなどでフィルタできます。
どの項目がフィルタできるかは次のURLに掲載されています。
https://learn.microsoft.com/en-us/graph/aad-advanced-queries?view=graph-rest-1.0&tabs=http

参考URL

フィルターの例
AND条件をフィルタで作る方法などが記載されている。
https://www.easy365manager.com/get-azureaduser-filter-example/

おまけスクリプト

Get-AzureADUserで取得したアドレス一覧を元にちょっと加工したCSVを出力するサンプルです。

$CSV = Get-MgUser <色々フィルタ> | ForEach-Object {
    # DisplayNameにスペース区切りで本名が入っているのでsplitしつつ変数に入れる
    $firstName,$lastName,$null,$null = $_.DisplayName -split ' '

    # メールアドレスはそのまま
    $mail = $_.mail

    # 新しいオブジェクトを作成してパイプラインに渡す
    [PSCustomObject]@{
        firstName = $firstName
        lastName = $lastName
        email = $mail
    }
} | Sort-Object -Property login

$CSV | Format-Table

$CSV | Export-Csv -Path $Query".csv" -NoTypeInformation -Encoding UTF8

Tips

オプション変数に値が入っていたら、その値を代入。
オプション変数が空だったら別の変数の値を代入。

example        = if ($optExample) { $optExample } else { $example }

Discussion