Utilizadores Apenas em Cloud vs. Sincronizados
Em ambientes de identidade híbrida, é comum ter dois tipos de utilizadores:
- Utilizadores sincronizados: criados no Active Directory local e sincronizados para o Entra ID
- Utilizadores apenas em cloud: criados diretamente no Entra ID sem contrapartida no AD local
Identificar os utilizadores apenas em cloud é essencial para:
- Entender quais contas não estão abrangidas pelas políticas de segurança locais
- Garantir a aplicação adequada de políticas de palavra-passe e ciclo de vida
- Identificar potenciais contas órfãs ou redundantes
- Planear estratégias de migração ou consolidação de diretórios
Identificação via Microsoft Graph
Para identificar utilizadores apenas em cloud:
# Ligar ao Microsoft Graph
Connect-MgGraph -Scopes "User.Read.All", "Directory.Read.All"
# Obter todos os utilizadores
$users = Get-MgUser -All -Property DisplayName, UserPrincipalName, Mail, AccountEnabled, OnPremisesSyncEnabled, CreatedDateTime, UserType
# Filtrar utilizadores apenas em cloud (não sincronizados)
$cloudOnlyUsers = $users | Where-Object {
$_.OnPremisesSyncEnabled -ne $true -and
$_.UserType -eq "Member"
}
# Apresentar utilizadores apenas em cloud
$cloudOnlyUsers |
Select-Object DisplayName, UserPrincipalName, Mail, AccountEnabled, CreatedDateTime |
Sort-Object -Property DisplayName |
Format-Table -AutoSize
Análise Detalhada de Utilizadores Apenas em Cloud
Para analisar mais detalhes sobre estes utilizadores:
# Adicionar informações sobre licenças e grupos
$cloudOnlyDetails = @()
foreach ($user in $cloudOnlyUsers) {
# Obter licenças atribuídas
$licenses = Get-MgUserLicenseDetail -UserId $user.Id
$licenseNames = if ($licenses) { ($licenses.ServicePlans | Select-Object -ExpandProperty ServicePlanName -Unique) -join ", " } else { "Sem licença" }
# Obter grupos a que o utilizador pertence
$groups = Get-MgUserMemberOf -UserId $user.Id
$groupCount = $groups.Count
# Verificar se o utilizador é administrador
$isAdmin = $false
foreach ($membership in $groups) {
if ($membership.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.directoryRole') {
$isAdmin = $true
break
}
}
# Obter última autenticação (se disponível)
$signIns = $null
try {
$signIns = Get-MgUserSignInActivity -UserId $user.Id -ErrorAction SilentlyContinue
} catch {
# Ignorar erros - pode não ter permissão ou utilizador sem atividade
}
$lastSignIn = if ($signIns -and $signIns.LastSignInDateTime) { $signIns.LastSignInDateTime } else { "Desconhecido" }
$cloudOnlyDetails += [PSCustomObject]@{
DisplayName = $user.DisplayName
UserPrincipalName = $user.UserPrincipalName
Enabled = $user.AccountEnabled
CreatedDate = $user.CreatedDateTime.ToString("yyyy-MM-dd")
DaysActive = [math]::Round(((Get-Date) - $user.CreatedDateTime).TotalDays)
IsAdmin = $isAdmin
GroupCount = $groupCount
LicenseStatus = if ($licenses) { "Licenciado" } else { "Sem licença" }
LastSignIn = $lastSignIn
}
}
# Apresentar detalhes
$cloudOnlyDetails | Format-Table DisplayName, UserPrincipalName, Enabled, CreatedDate, DaysActive, IsAdmin, GroupCount, LicenseStatus -AutoSize
Relatório de Resumo
Para gerar um relatório resumido sobre utilizadores apenas em cloud:
$totalUsers = $users.Count
$cloudOnlyCount = $cloudOnlyUsers.Count
$percentCloudOnly = [math]::Round(($cloudOnlyCount / $totalUsers) * 100, 2)
$enabledCount = ($cloudOnlyUsers | Where-Object { $_.AccountEnabled }).Count
$disabledCount = $cloudOnlyCount - $enabledCount
$adminCount = ($cloudOnlyDetails | Where-Object { $_.IsAdmin }).Count
$licensedCount = ($cloudOnlyDetails | Where-Object { $_.LicenseStatus -eq "Licenciado" }).Count
# Agrupar por antiguidade
$recentUsers = ($cloudOnlyDetails | Where-Object { $_.DaysActive -le 90 }).Count
$oldUsers = ($cloudOnlyDetails | Where-Object { $_.DaysActive -gt 365 }).Count
Write-Output "=== Relatório de Utilizadores Apenas em Cloud ==="
Write-Output "Total de Utilizadores no Entra ID: $totalUsers"
Write-Output "Utilizadores Apenas em Cloud: $cloudOnlyCount ($percentCloudOnly%)"
Write-Output ""
Write-Output "Estado das Contas:"
Write-Output "- Contas Ativas: $enabledCount"
Write-Output "- Contas Desativadas: $disabledCount"
Write-Output ""
Write-Output "Outros Indicadores:"
Write-Output "- Utilizadores com Privilégios Administrativos: $adminCount"
Write-Output "- Utilizadores com Licenças Atribuídas: $licensedCount"
Write-Output "- Contas Criadas nos Últimos 90 Dias: $recentUsers"
Write-Output "- Contas com Mais de 1 Ano: $oldUsers"
Considerações de Gestão
Para exportar a lista de utilizadores apenas em cloud para análise posterior:
# Exportar para CSV
$cloudOnlyDetails | Export-Csv -Path "CloudOnlyUsers.csv" -NoTypeInformation
Write-Output "Lista exportada para CloudOnlyUsers.csv"
Melhores Práticas
- Avalie regularmente a necessidade de utilizadores apenas em cloud vs. sincronizados
- Implemente uma política clara para aprovação e criação de utilizadores apenas em cloud
- Considere a implementação de revisões de acesso periódicas para utilizadores apenas em cloud
- Para utilizadores empresariais permanentes, avalie se deveriam ser geridos no AD local
- Atribua proprietários claros para utilizadores apenas em cloud, principalmente para contas de serviço
- Implemente políticas de palavra-passe fortes específicas para utilizadores apenas em cloud
- Utilize etiquetas ou grupos para identificar e categorizar utilizadores apenas em cloud