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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
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 { } } |