目的
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