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

 

También te podría gustar...