Enumerar recurrentemente miembros de grupos de Azure AD con PowerShell
Habitualmente podemos encontrar secuencias de comandos de PowerShell que para signar licencias a usuarios de AzureAD/Office 365 utilizan grupos. El problema lo tenemos con los grupos anidados, ya que por el momento el cmdlet Get-MsolGroupMember no los soporta.
Para solucionar este problema, podemos hacer uso de esta sencilla función Get-ReMsolGroupMember. Esta función comprobará si un grupo se compone de otros grupos, y en bucle a través de ellos irá enumerando a todos los miembros. Una vez comprobado que todos los miembros han sido enumerados, los ordenará para descartar las posibles duplicidades de miembros.
En acción:

Get-ReMsolGroupMember
function Get-ReMsolGroupMember {
<#
.SYNOPSIS
The function enumerates Azure AD Group members with the support for nested groups.
.EXAMPLE
Get-ReMsolGroupMember 6d34ab03-301c-4f3a-8436-98f873ec121a
.EXAMPLE
Get-ReMsolGroupMember -ObjectId 6d34ab03-301c-4f3a-8436-98f873ec121a -Recursive
.EXAMPLE
Get-MsolGroup -SearchString "Office 365 E5" | Get-ReMsolGroupMember -Recursive
#>
param(
[CmdletBinding(SupportsShouldProcess=$true)]
[Parameter(Mandatory=$true, ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,Position=0)]
[ValidateScript({Get-MsolGroup -ObjectId $_})]
$ObjectId,
[switch]$Recursive
)
begin {
$MSOLAccountSku = Get-MsolAccountSku -ErrorAction Ignore -WarningAction Ignore
if (-not($MSOLAccountSku)) {
throw "No conectado a AzureAD, ejecuta Connect-MsolService"
}
}
process {
Write-Verbose -Message "Enumerando miembros del grupo $ObjectId"
$UserMembers = Get-MsolGroupMember -GroupObjectId $ObjectId -MemberObjectTypes User -All
if ($PSBoundParameters['Recursive']) {
$GroupsMembers = Get-MsolGroupMember -GroupObjectId $ObjectId -MemberObjectTypes Group -All
if ($GroupsMembers) {
Write-Verbose -Message "$ObjectId tiene $($GroupsMembers.count) grupo(s) como miembros, enumerando..."
$GroupsMembers | ForEach-Object -Process {
Write-Verbose "Enumerando del grupo anidado $($_.Displayname) ($($_.ObjectId))"
$UserMembers += Get-ReMsolGroupMember -Recursive -ObjectId $_.ObjectId
}
}
}
Write-Output ($UserMembers | Sort-Object -Property EmailAddress -Unique)
}
end {
}
}


