Skip to content
Go back

Utilizadores Capazes de SSPR

Published:  at  10:00 AM

Índice

SSPR: Capacitação do Utilizador e Redução de Custos

O Self-Service Password Reset (SSPR) é um recurso essencial para organizações que:

No entanto, para utilizar o SSPR, os utilizadores precisam registar métodos de autenticação adequados, como números de telefone, e-mails alternativos ou aplicativos de autenticação.

Identificação via Microsoft Graph API

Para identificar quais utilizadores registaram métodos de autenticação para SSPR:

# Ligar ao Microsoft Graph
Connect-MgGraph -Scopes "UserAuthenticationMethod.Read.All", "User.Read.All"

# Obter todos os utilizadores (excluir contas de serviço)
$users = Get-MgUser -All -Property Id, DisplayName, UserPrincipalName, AccountEnabled

# Array para resultados
$ssprCapableUsers = @()
$ssprIncapableUsers = @()

# Processar cada utilizador
foreach ($user in $users) {
    # Obter métodos de autenticação registados
    $authMethods = Get-MgUserAuthenticationMethod -UserId $user.Id
    
    # Analisar métodos registados
    $hasMobile = $false
    $hasEmail = $false
    $hasAuthenticator = $false
    $hasFido2 = $false
    $hasPhoneAuth = $false
    
    foreach ($method in $authMethods) {
        $methodType = $method.AdditionalProperties.'@odata.type'
        
        if ($methodType -eq '#microsoft.graph.mobilePhoneAuthenticationMethod') {
            $hasMobile = $true
        }
        elseif ($methodType -eq '#microsoft.graph.emailAuthenticationMethod') {
            $hasEmail = $true
        }
        elseif ($methodType -eq '#microsoft.graph.microsoftAuthenticatorAuthenticationMethod') {
            $hasAuthenticator = $true
        }
        elseif ($methodType -eq '#microsoft.graph.fido2AuthenticationMethod') {
            $hasFido2 = $true
        }
        elseif ($methodType -eq '#microsoft.graph.phoneAuthenticationMethod') {
            $hasPhoneAuth = $true
        }
    }
    
    # Determinar capacidade SSPR
    # Nota: A política SSPR determina quais métodos são aceites, isto é apenas uma verificação genérica
    $hasAnySSPRMethod = $hasMobile -or $hasEmail -or $hasAuthenticator -or $hasFido2 -or $hasPhoneAuth
    
    $userDetails = [PSCustomObject]@{
        UserPrincipalName = $user.UserPrincipalName
        DisplayName = $user.DisplayName
        Enabled = $user.AccountEnabled
        HasMobilePhone = $hasMobile
        HasEmail = $hasEmail
        HasAuthenticator = $hasAuthenticator
        HasFido2 = $hasFido2
        HasPhoneAuth = $hasPhoneAuth
        TotalMethods = ($hasMobile, $hasEmail, $hasAuthenticator, $hasFido2, $hasPhoneAuth | Where-Object { $_ -eq $true }).Count
    }
    
    if ($hasAnySSPRMethod) {
        $ssprCapableUsers += $userDetails
    } else {
        $ssprIncapableUsers += $userDetails
    }
}

# Apresentar utilizadores capazes de SSPR
Write-Output "Utilizadores capazes de SSPR ($($ssprCapableUsers.Count) de $($users.Count)):"
$ssprCapableUsers | 
    Sort-Object -Property DisplayName | 
    Format-Table DisplayName, UserPrincipalName, TotalMethods -AutoSize

Análise de Métodos Mais Utilizados

Para analisar quais métodos são mais populares:

# Contagem de métodos
$mobileCount = ($ssprCapableUsers | Where-Object { $_.HasMobilePhone -eq $true }).Count
$emailCount = ($ssprCapableUsers | Where-Object { $_.HasEmail -eq $true }).Count
$authenticatorCount = ($ssprCapableUsers | Where-Object { $_.HasAuthenticator -eq $true }).Count
$fido2Count = ($ssprCapableUsers | Where-Object { $_.HasFido2 -eq $true }).Count
$phoneCount = ($ssprCapableUsers | Where-Object { $_.HasPhoneAuth -eq $true }).Count

$totalUsers = $users.Count
$ssprPercentage = [math]::Round(($ssprCapableUsers.Count / $totalUsers) * 100, 2)

# Apresentar estatísticas
Write-Output "=== Estatísticas de Registo SSPR ==="
Write-Output "Total de Utilizadores: $totalUsers"
Write-Output "Utilizadores Capazes de SSPR: $($ssprCapableUsers.Count) ($ssprPercentage%)"
Write-Output "Utilizadores Sem Métodos SSPR: $($ssprIncapableUsers.Count) ($([math]::Round(100 - $ssprPercentage, 2))%)"
Write-Output ""
Write-Output "Métodos Registados:"
Write-Output "- Telemóvel: $mobileCount ($([math]::Round(($mobileCount / $totalUsers) * 100, 2))%)"
Write-Output "- Email Alternativo: $emailCount ($([math]::Round(($emailCount / $totalUsers) * 100, 2))%)"
Write-Output "- Microsoft Authenticator: $authenticatorCount ($([math]::Round(($authenticatorCount / $totalUsers) * 100, 2))%)"
Write-Output "- FIDO2/Passkey: $fido2Count ($([math]::Round(($fido2Count / $totalUsers) * 100, 2))%)"
Write-Output "- Telefone de Escritório: $phoneCount ($([math]::Round(($phoneCount / $totalUsers) * 100, 2))%)"

Identificação de Utilizadores Prioritários Sem SSPR

Para identificar utilizadores importantes que não registaram métodos SSPR:

# Identificar utilizadores prioritários sem SSPR
$priorityUsers = @()

foreach ($user in $ssprIncapableUsers) {
    # Verificar se utilizador está em grupos importantes
    $userId = ($users | Where-Object { $_.UserPrincipalName -eq $user.UserPrincipalName }).Id
    $userGroups = Get-MgUserMemberOf -UserId $userId
    
    $isVIP = $false
    $isIT = $false
    
    foreach ($group in $userGroups) {
        if ($group.AdditionalProperties.displayName -like "*VIP*" -or
            $group.AdditionalProperties.displayName -like "*Executiv*") {
            $isVIP = $true
        }
        
        if ($group.AdditionalProperties.displayName -like "*IT*" -or
            $group.AdditionalProperties.displayName -like "*Admin*") {
            $isIT = $true
        }
    }
    
    # Verificar se tem licença premium (ex: E5)
    $licenses = Get-MgUserLicenseDetail -UserId $userId
    $hasE5 = $false
    
    foreach ($license in $licenses) {
        if ($license.SkuPartNumber -like "*E5*") {
            $hasE5 = $true
            break
        }
    }
    
    if ($isVIP -or $isIT -or $hasE5) {
        $priorityUsers += [PSCustomObject]@{
            UserPrincipalName = $user.UserPrincipalName
            DisplayName = $user.DisplayName
            IsVIP = $isVIP
            IsIT = $isIT
            HasE5 = $hasE5
            Priority = if ($isVIP) { "Alta" } elseif ($isIT) { "Média" } else { "Normal" }
        }
    }
}

# Apresentar utilizadores prioritários
Write-Output "Utilizadores Prioritários Sem SSPR:"
$priorityUsers | 
    Sort-Object -Property Priority, DisplayName | 
    Format-Table DisplayName, UserPrincipalName, Priority, IsVIP, IsIT -AutoSize

Recomendações para Melhorar Adoção

# Gerar relatório de recomendações
$registrationRate = $ssprPercentage
$targetRate = 95

Write-Output "=== Recomendações para Aumentar Adoção de SSPR ==="
Write-Output "Taxa Atual de Registo: $registrationRate%"
Write-Output "Taxa Alvo Recomendada: $targetRate%"
Write-Output ""

if ($registrationRate -lt 50) {
    Write-Output "Recomendações (Prioridade Alta):"
    Write-Output "1. Implementar campanha de consciencialização sobre SSPR"
    Write-Output "2. Comunicar benefícios de SSPR para os utilizadores"
    Write-Output "3. Considerar registo combinado de MFA/SSPR durante onboarding"
    Write-Output "4. Programar sessões de formação para equipas com baixa adoção"
} 
elseif ($registrationRate -lt 80) {
    Write-Output "Recomendações (Prioridade Média):"
    Write-Output "1. Focar nos utilizadores prioritários identificados"
    Write-Output "2. Implementar lembretes periódicos para utilizadores não registados"
    Write-Output "3. Considerar registo assistido para executivos"
}
else {
    Write-Output "Recomendações (Manutenção):"
    Write-Output "1. Monitorizar utilizadores novos e garantir registo durante onboarding"
    Write-Output "2. Considerar tornar registo obrigatório para atingir meta de $targetRate%"
    Write-Output "3. Promover métodos mais seguros (Authenticator vs. SMS)"
}

Exportação de Dados para Análise

Para exportar a lista de utilizadores para análise adicional:

# Exportar para CSV
$ssprCapableUsers | Export-Csv -Path "SSPRCapableUsers.csv" -NoTypeInformation
$ssprIncapableUsers | Export-Csv -Path "SSPRIncapableUsers.csv" -NoTypeInformation
$priorityUsers | Export-Csv -Path "PriorityUsersWithoutSSPR.csv" -NoTypeInformation

Write-Output "Dados exportados para análise adicional"

Suggest Changes

Previous Post
Utilizadores Inexistentes em Logs de Autenticação
Next Post
Utilizadores com Passkeys