Skip to content
Go back

Proprietários de Grupos Microsoft 365

Published:  at  11:00 AM

Importância dos Proprietários de Grupos

Os proprietários de grupos Microsoft 365 têm responsabilidades significativas:

A falta de proprietários adequados pode levar a problemas de governança e segurança, como:

Identificação via Microsoft Graph

Para listar todos os grupos e seus proprietários:

# Conectar ao Microsoft Graph
Connect-MgGraph -Scopes "Group.Read.All", "User.Read.All"

# Obter todos os grupos Microsoft 365
$groups = Get-MgGroup -Filter "groupTypes/any(c:c eq 'Unified')" -All

# Criar array para armazenar resultados
$groupsWithOwners = @()

foreach ($group in $groups) {
    # Obter proprietários do grupo
    $owners = Get-MgGroupOwner -GroupId $group.Id
    $ownerCount = $owners.Count
    
    # Obter detalhes dos proprietários
    $ownerDetails = @()
    foreach ($owner in $owners) {
        $ownerObject = Get-MgUser -UserId $owner.Id -ErrorAction SilentlyContinue
        if ($ownerObject) {
            $ownerDetails += "$($ownerObject.DisplayName) ($($ownerObject.UserPrincipalName))"
        } else {
            # Pode ser um proprietário que é um service principal
            $spOwner = Get-MgServicePrincipal -ServicePrincipalId $owner.Id -ErrorAction SilentlyContinue
            if ($spOwner) {
                $ownerDetails += "$($spOwner.DisplayName) (Aplicação)"
            } else {
                $ownerDetails += "Desconhecido ($($owner.Id))"
            }
        }
    }
    
    # Adicionar informações ao array de resultados
    $groupsWithOwners += [PSCustomObject]@{
        DisplayName = $group.DisplayName
        Description = $group.Description
        Id = $group.Id
        OwnerCount = $ownerCount
        Owners = $ownerDetails -join ", "
        HasOwners = $ownerCount -gt 0
        CreatedDateTime = $group.CreatedDateTime
        MemberCount = if ($group.MemberCount) { $group.MemberCount } else { "N/A" }
        IsTeam = $null -ne ($group.ProxyAddresses | Where-Object { $_ -like "SPO:*" })
    }
}

# Exibir grupos sem proprietários (problema crítico de governança)
$groupsWithoutOwners = $groupsWithOwners | Where-Object { -not $_.HasOwners }
Write-Output "Grupos sem proprietários ($($groupsWithoutOwners.Count)):"
$groupsWithoutOwners | Format-Table DisplayName, CreatedDateTime, MemberCount, IsTeam -AutoSize

# Exibir todos os grupos com seus proprietários
Write-Output "`nTodos os grupos com proprietários:"
$groupsWithOwners | Format-Table DisplayName, OwnerCount, Owners -AutoSize

Análise de Proprietários por Distribuição

Para analisar a distribuição de propriedade:

# Agrupar por número de proprietários
$ownerDistribution = $groupsWithOwners | Group-Object -Property OwnerCount | Sort-Object -Property Name

# Calcular estatísticas
$totalGroups = $groupsWithOwners.Count
$groupsWithMultipleOwners = ($groupsWithOwners | Where-Object { $_.OwnerCount -ge 2 }).Count
$percentWithMultipleOwners = [math]::Round(($groupsWithMultipleOwners / $totalGroups) * 100, 2)

# Identificar utilizadores com maior número de propriedades de grupo
$allOwners = @()
foreach ($group in $groupsWithOwners) {
    $ownersList = $group.Owners -split ", "
    foreach ($owner in $ownersList) {
        if (-not [string]::IsNullOrEmpty($owner)) {
            $allOwners += $owner
        }
    }
}

$topOwners = $allOwners | Group-Object | Sort-Object -Property Count -Descending | Select-Object -First 10

# Exibir estatísticas
Write-Output "=== Análise de Proprietários de Grupos ==="
Write-Output "Total de grupos Microsoft 365: $totalGroups"
Write-Output "Distribuição de proprietários:"
foreach ($item in $ownerDistribution) {
    $percentage = [math]::Round(($item.Count / $totalGroups) * 100, 2)
    Write-Output "- Grupos com $($item.Name) proprietário(s): $($item.Count) ($percentage%)"
}
Write-Output "`nGrupos com múltiplos proprietários: $groupsWithMultipleOwners ($percentWithMultipleOwners%)"

Write-Output "`nTop 10 proprietários de grupos:"
foreach ($owner in $topOwners) {
    Write-Output "- $($owner.Name): $($owner.Count) grupos"
}

Recomendações para Boa Governança

# Gerar recomendações com base na análise
Write-Output "=== Recomendações de Governança ==="

# Tratar grupos sem proprietários
if ($groupsWithoutOwners.Count -gt 0) {
    Write-Output "1. Atribuir pelo menos um proprietário para os $($groupsWithoutOwners.Count) grupos órfãos."
    
    # Sugerir proprietários com base nos membros mais ativos
    Write-Output "   Grupos órfãos prioritários para ação:"
    $groupsWithoutOwners | 
        Sort-Object -Property MemberCount -Descending | 
        Select-Object -First 5 |
        Format-Table DisplayName, MemberCount, CreatedDateTime -AutoSize
}

# Garantir múltiplos proprietários
$singleOwnerPercentage = ($ownerDistribution | Where-Object { $_.Name -eq "1" }).Count / $totalGroups * 100
if ($singleOwnerPercentage -gt 50) {
    Write-Output "2. Aumentar o número de grupos com múltiplos proprietários (atualmente apenas $percentWithMultipleOwners%)."
    Write-Output "   Considerar a atribuição de um segundo proprietário para grupos críticos com apenas um proprietário."
}

# Evitar concentração excessiva
$maxOwnershipCount = ($topOwners | Select-Object -First 1).Count
if ($maxOwnershipCount -gt 20) {
    Write-Output "3. Redistribuir propriedade de grupos do utilizador '$($topOwners[0].Name)' que possui $maxOwnershipCount grupos."
    Write-Output "   Considerar a delegação para reduzir o risco de único ponto de falha."
}

# Recomendação geral
Write-Output "4. Implementar revisões periódicas de proprietários de grupos (trimestrais)."
Write-Output "5. Configurar políticas de expiração de grupos para grupos sem atividade."
Write-Output "6. Documentar processo para transferência de propriedade quando utilizadores saem da organização."

Boas Práticas para Proprietários de Grupos


Suggest Changes

Previous Post
Fluxo Client Credentials
Next Post
Certificados SAML Expirados