複数ユーザの所属しているグループの一括取得方法について

BCAzure01 25 評価のポイント
2025-10-28T03:09:38.2533333+00:00

社員の部門移動に伴い、所属しているMS365の以下、グループを洗い出す必要があります。

・MS365グループ ・セキュリティグループ ・メールが有効なセキュリティグループ

毎月100名近くの社員が移動するためその度に必要となり工数増加及び対応メンバーの負荷が増えています。一括で複数ユーザが所属しているグループを抽出する方法を教えてください。

※PowerShellのコマンド実行などを想定

【現在の方法】

・entra管理センターにログイン、ユーザから対象者を検索。

 画面上から所属グループを選択し、作業Excelに貼り付け。

・貼り付け後、各グループ毎に各管理台帳のExcelにコピペして洗い出し

【検証状況】

デスクトップ調査をもとに、以下コマンドを実行しましたが、複数行出るものの、対象のグループ名や紐づくID、メールアドレス等は取得できませんでした。

★★★★★★★★★★★★★★★★★★★★★★★★

===============================================

Get-M365GroupMembership.ps1

Microsoft Graph PowerShell で Email 列をキーに所属グループを一括出力

===============================================

▼ 1. Graph 接続

Write-Host "Microsoft Graph に接続中..."

Connect-MgGraph -Scopes "User.Read.All","Group.Read.All" | Out-Null

▼ 2. 入出力パス設定(必要に応じて変更)

$inputPath = "C:\Users\kmorikawa\Desktop\アカウント改善PJT\202510_社員の権限一括洗い出し\Input\TransferList.csv"

$outputPath = "C:\Users\kmorikawa\Desktop\アカウント改善PJT\202510_社員の権限一括洗い出し\Output\GroupMembershipList.csv"

出力ファイル初期化

if (Test-Path $outputPath) { Remove-Item $outputPath }

New-Item -Path $outputPath -ItemType File | Out-Null

▼ 3. 異動者リスト読み込み

$users = Import-Csv $inputPath -Delimiter "," # 区切りがタブなら "`t"

▼ 4. 各ユーザーのグループ情報取得

foreach ($user in $users) {

if (-not $user.Email -or [string]::IsNullOrWhiteSpace($user.Email)) {

    Write-Warning "Emailが空の行をスキップしました: $($user.DisplayName)"

    continue

}

$email = $user.Email.Trim()

Write-Host "処理中: $($user.DisplayName) ($email)..."

try {

    # EmailをキーにuserPrincipalName/mail属性の両方で検索

    $userObj = Get-MgUser -Filter "startswith(userPrincipalName,'$email')" -Property Id,DisplayName,Mail

    if (-not $userObj) {

        $userObj = Get-MgUser -Filter "startswith(mail,'$email')" -Property Id,DisplayName,Mail

    }

    if ($userObj) {

        $groups = Get-MgUserMemberOf -UserId $userObj.Id -All

        foreach ($group in $groups) {

            # グループ種別分類

            $type = if ($group.GroupTypes -contains "Unified") {"M365 Group"}

                    elseif ($group.MailEnabled -and $group.SecurityEnabled) {"Mail-enabled Security Group"}

                    elseif ($group.SecurityEnabled) {"Security Group"}

                    else {"Other"}

            # 結果出力

            [PSCustomObject]@{

                EmployeeID      = $user.EmployeeID

                DisplayName     = $user.DisplayName

                Email           = $email

                GroupName       = $group.DisplayName

                GroupType       = $type

                MailEnabled     = $group.MailEnabled

                SecurityEnabled = $group.SecurityEnabled

            } | Export-Csv -Path $outputPath -Append -NoTypeInformation -Encoding UTF8

        }

    }

    else {

        Write-Warning "ユーザー未検出: $email"

    }

}

catch {

    Write-Warning "エラー: $email - $_"

}
}

▼ 5. 完了通知

Write-Host "`n処理完了しました。結果: $outputPath"

★★★★★★★★★★★★★★★★★★★★★★★★


<モデレーター注>
この質問は「Microsoft System Center | その他」に投稿されましたが、Microsoft Q&A(ja-jp)ではサポートしていない質問内容なので「監視対象外」に変更しました。

コミュニティ センター | 監視されない

ロックされた質問。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

1 件の回答

並べ替え方法: 最も役に立つ
  1. Hebikuzure aka Murachi Akira 335.3K 評価のポイント MVP ボランティア モデレーター
    2025-10-28T05:34:52.82+00:00

    この手の作業は、一度にスクリプトを書いて完成させようとするのではなく、一部分ごとに動作を確認しながら行った方が良いですね。

    まず特定の1ユーザー決め打ちで、所属グループの情報が取得できるか確認してください。

    Graph AIP を使えば

    の方法で特定のユーザーが所属しているグループを一括取得できます。

    ただし取得できるのは「直接のメンバーシップ」までで、推移的(グループが入れ子になっている場合の最終的な所属)なメンバーシップまで取得する場合は、以下を使います。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません