Índice
SSPR: Capacitação do Utilizador e Redução de Custos
O Self-Service Password Reset (SSPR) é um recurso essencial para organizações que:
- Reduz significativamente chamados ao service desk
- Diminui tempo de inatividade do utilizador
- Aumenta a satisfação dos utilizadores
- Melhora a postura de segurança através da verificação de identidade forte
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"