コマンドを使ってMicrosft365のアドレス帳を取得する(Graph版)
これはなに?
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に掲載されています。
参考URL
フィルターの例
AND条件をフィルタで作る方法などが記載されている。
おまけスクリプト
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