Cómo encontrar usuarios inactivos e invitados en Entra ID con PowerShell
Las cuentas que nadie usa y los invitados olvidados son una puerta abierta (y licencias pagadas de más). Te damos los scripts de Microsoft Graph para encontrarlos y un proceso seguro para limpiarlos.
Cada cuenta que nadie usa es una cuenta que nadie vigila. Antiguos empleados, cuentas de prueba, invitados de un proyecto que terminó hace dos años… Son objetivos fáciles para un atacante y, además, suelen tener licencias de Microsoft 365 que sigues pagando.
En esta guía verás cómo encontrarlas con Microsoft Graph PowerShell y cómo limpiarlas sin sustos.
Requisitos
- El módulo Microsoft.Graph de PowerShell (
Install-Module Microsoft.Graph -Scope CurrentUser). - Permisos de lectura:
User.Read.AllyAuditLog.Read.All. - Para leer la última fecha de inicio de sesión (
signInActivity) el tenant necesita Microsoft Entra ID P1 o P2 (incluido en Microsoft 365 Business Premium).
Usuarios sin iniciar sesión en 90 días
Connect-MgGraph -Scopes "User.Read.All","AuditLog.Read.All"
$limite = (Get-Date).AddDays(-90)
Get-MgUser -All -Property DisplayName,UserPrincipalName,AccountEnabled,UserType,CreatedDateTime,SignInActivity |
Where-Object {
$_.AccountEnabled -and $_.UserType -eq "Member" -and
(-not $_.SignInActivity.LastSuccessfulSignInDateTime -or $_.SignInActivity.LastSuccessfulSignInDateTime -lt $limite)
} |
Select-Object DisplayName, UserPrincipalName, CreatedDateTime,
@{ n = "UltimoInicio"; e = { $_.SignInActivity.LastSuccessfulSignInDateTime } } |
Sort-Object UltimoInicio |
Export-Csv -Path .\usuarios-inactivos.csv -NoTypeInformation -Encoding UTF8
Algunos detalles importantes:
LastSuccessfulSignInDateTimerecoge el último inicio de sesión correcto. También existenLastSignInDateTime(interactivo) yLastNonInteractiveSignInDateTime(tokens de apps en segundo plano).- Una cuenta creada hace poco puede no tener inicios todavía: revisa
CreatedDateTimeantes de actuar. - Las cuentas de servicio y las cuentas de emergencia aparecerán en la lista a propósito. Documéntalas y exclúyelas.
Invitados (usuarios B2B)
Get-MgUser -All -Filter "userType eq 'Guest'" -Property DisplayName,Mail,CreatedDateTime,ExternalUserState,SignInActivity |
Select-Object DisplayName, Mail, CreatedDateTime, ExternalUserState,
@{ n = "UltimoInicio"; e = { $_.SignInActivity.LastSuccessfulSignInDateTime } } |
Sort-Object UltimoInicio
Fíjate en ExternalUserState: PendingAcceptance significa que el invitado ni siquiera aceptó la invitación.
Qué licencias tienen asignadas
Get-MgUser -All -Property UserPrincipalName,AssignedLicenses |
Where-Object { $_.AssignedLicenses.Count -gt 0 } |
Select-Object UserPrincipalName, @{ n = "Licencias"; e = { $_.AssignedLicenses.Count } }
Cruzar esta lista con la de inactivos suele revelar ahorros inmediatos.
Un proceso de limpieza seguro
Nunca borres directamente. Mejor así:
- Valida la lista con RR. HH. o con los responsables de cada departamento.
- Desactiva la cuenta (bloquear inicio de sesión) y revoca las sesiones:
Update-MgUser -UserId "antiguo@tuempresa.es" -AccountEnabled:$false
Revoke-MgUserSignInSession -UserId "antiguo@tuempresa.es"
- Si es un antiguo empleado, decide qué hacer con su buzón y OneDrive (convertir en buzón compartido, transferir archivos).
- Espera 30 días por si alguien la echa de menos.
- Elimina la cuenta y libera la licencia. Los usuarios eliminados pueden restaurarse durante 30 días.
Evita que vuelva a pasar
- Proceso de bajas: una lista de comprobación compartida entre RR. HH. e IT.
- Revisiones de acceso para invitados (requieren Microsoft Entra ID Governance o P2): los responsables confirman cada trimestre si el invitado sigue siendo necesario.
- Restringe quién puede invitar en Identidades externas → Configuración de colaboración externa.
Qué dice la documentación oficial de Microsoft
- Administrar cuentas de usuario inactivas: de dónde salen las fechas del script.
- Revisiones de acceso para invitados: cómo automatizar la limpieza de invitados.
- Configurar la colaboración externa: restringe quién puede invitar.
Conclusión
Una limpieza trimestral de usuarios inactivos e invitados reduce el riesgo y, casi siempre, la factura de licencias. En NexoID lo automatizamos con PowerShell y Graph para que el informe llegue solo cada mes.
¿Quieres saber cuántas cuentas olvidadas tienes? Empieza con la demo gratuita.
¿Tienes una duda sobre este tema?
Pregunta y te respondemos personalmente. Publicamos las preguntas útiles para todos (solo con tu nombre, nunca tu email).
Aún no hay preguntas publicadas. ¡Sé el primero!
Recibe los nuevos artículos por email
Un aviso cuando publiquemos algo nuevo. Sin spam y con baja en un clic.