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.All y AuditLog.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:

  • LastSuccessfulSignInDateTime recoge el último inicio de sesión correcto. También existen LastSignInDateTime (interactivo) y LastNonInteractiveSignInDateTime (tokens de apps en segundo plano).
  • Una cuenta creada hace poco puede no tener inicios todavía: revisa CreatedDateTime antes 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í:

  1. Valida la lista con RR. HH. o con los responsables de cada departamento.
  2. 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"
  1. Si es un antiguo empleado, decide qué hacer con su buzón y OneDrive (convertir en buzón compartido, transferir archivos).
  2. Espera 30 días por si alguien la echa de menos.
  3. 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

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.

Preguntas de los lectores

¿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!

No se publica. Te confirmamos que la hemos recibido y, si quieres, te avisamos de la respuesta.

Sigue leyendo