目的
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
if ($aad_object.ObjectType -eq 'User')
{
$output += New-Object PSObject -property @{
DisplayName= $aad_object.DisplayName
}
}
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