たれながし.info

とあるITエンジニアの備忘録

AzureADのネストグループの全所属メンバーをPowerShellで出力する

目的

AzureADの特定グループの全所属メンバーをPowershellで出力しようとしたところ、グループがネストされている場合にうまく出力できませんでした。
解決策を調べたところ、関数を作成して解決している人がいたので試してみます。


<参考にしたサイト>
www.fixes.pub

事前準備

PowerShellでAzureADを操作するにはモジュールが必要なのでインストールする
PowerShellは管理者権限で起動する必要がある

Install-Module -Name AzureAD



AzureADに接続し認証する
※「Code: Authentication_Unauthorized」と表示される場合はTenantIdでディレクトリを指定する

Connect-AzureAD -TenantId xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

問題点

下記のようなネストされたグループを考えます。

Group_A
├─UserA
└─Group_B
    ├─UserB
    └─UserC



「Get-AzureADGroupMember」でグループAのメンバーを取得してもObjectIdが取得できるだけで、グループBのメンバーは展開されません

# スクリプト
$groupName = "Group_A"
$groupId = (Get-AzureADGroup -Filter "DisplayName eq '$groupName'").objectId
Get-AzureADGroupMember -objectId $groupId -All $true
# 実行結果
ObjectId                             DisplayName UserPrincipalName                           UserType
--------                             ----------- -----------------                           --------
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx UserA       UserA@xxxxx.onmicrosoft.com Member

DeletionTimestamp            :
ObjectId                     : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ObjectType                   : Group
Description                  :
DirSyncEnabled               :
DisplayName                  : Group_B
...

解決方法

ネストグループを展開する関数を作成することで、全メンバーが出力できます。
※DisplayNameの部分は任意のプロパティに変更しても良い 例)ObjectIdなど

# スクリプト
Function  Get-AzureADGroupMembers($groupId) {
   $output= @()
   $group= (Get-AzureADGroupMember -ObjectId $groupId -All $True| Select ObjectId).ObjectId
   foreach($objectid in $group)
     {
        $aad_object=  Get-AzureADObjectByObjectId -ObjectId $objectid
        #Add to output if object is a user
        if ($aad_object.ObjectType -eq 'User')
        {
                   $output += New-Object PSObject -property @{
                    DisplayName= $aad_object.DisplayName
                 }
        }
        #Recursive call if the object is a group
        if ($aad_object.ObjectType -eq 'Group')
        {
                   $output += Get-AzureADGroupMembers -groupId $aad_object.ObjectId
        }
     }
    return $output
}

$groupName = "Group_A"
$groupId = (Get-AzureADGroup -Filter "DisplayName eq '$groupName'").objectId
Get-AzureADGroupMembers($groupId)
# 実行結果
DisplayName
-----------
UserA
UserB
UserC

おわりに

同様のスクリプトを作成している人が他にもいました。こちらのスクリプトはDeviceも考慮しているようです。
bwit.blog