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 { } }