¿Necesitas saber a qué grupos pertenece un usuario cuando su identidad vive exclusivamente en Azure Active Directory y whoami /groups
ya no está disponible? En esta guía aprenderás, paso a paso, los métodos respaldados por Microsoft Graph para obtener listados completos –incluidos grupos anidados y equipos de Microsoft 365– mediante PowerShell, CLI de Azure, Portal y llamadas REST.
Por qué whoami
deja de funcionar en Azure AD
El comando whoami /groups
consulta el token de acceso emitido por el controlador de dominio on‑premises (AD DS). Cuando un dispositivo está unido a Azure AD o cuando la cuenta es “cloud‑only”, el motor de autenticación cambia: los tokens se generan en Azure AD y exponen únicamente los grupos necesarios para la sesión (normalmente los que se usan en asignaciones de roles). Para un inventario completo debes ir directamente a la fuente de verdad: Microsoft Graph.
Comparativa rápida de métodos
Opción | Comando / ruta | Notas rápidas |
---|---|---|
PowerShell (AzureAD) | Get-AzureADUserMembership -ObjectId user@contoso.com | Incluye todos los grupos (seguridad + Microsoft 365). El módulo AzureAD está en mantenimiento: úsalo solo en entornos legados. |
PowerShell (Microsoft.Graph) | Get-MgUserMemberOf -UserId user@contoso.com Grupos transitorios: Get-MgUserTransitiveMemberOf -UserId user@contoso.com | Where-Object { $_.AdditionalProperties["@odata.type"] -eq "#microsoft.graph.group" } | Requiere User.Read.All o Directory.Read.All . Ideal para nuevos scripts y automatizaciones. |
CLI de Azure | az ad user get-member-groups --id user@contoso.com --security-enabled-only false | Devuelve los ids de grupo; combínalo con az ad group show para obtener nombres descriptivos. |
Portal de Azure | Azure Active Directory → Usuarios → (usuario) → Grupos | Vista gráfica inmediata de membresías directas. |
API REST (Graph) | GET /v1.0/users/{user-id}/memberOf GET /v1.0/users/{user-id}/transitiveMemberOf | Recomendado para integraciones personalizadas: soporta paginación $top/$skip y filtros OData. |
Requisitos previos de permisos
- Delegados: la sesión interactiva debe consentir “User.Read” (básico) y, para leer otros usuarios, “User.Read.All”.
- Aplicaciones: se requiere un service principal con “Directory.Read.All” o, si vas a escribir grupos, “Group.ReadWrite.All”. El consentimiento de administrador es obligatorio.
- Si usas PowerShell Graph, ejecuta
Connect-MgGraph -Scopes "Directory.Read.All"
y almacena un refresh token seguro (por ejemplo, en Azure Key Vault).
Ejemplo completo con PowerShell Graph
# Conectar al endpoint global:
Connect-MgGraph -Scopes "Directory.Read.All"
\# Obtener grupo + rol (incluso los heredados):
\$groups = Get-MgUserTransitiveMemberOf ` -UserId "user@contoso.com"`
-All \`
\| Where-Object { $\_.AdditionalProperties\["@odata.type"] -eq "#microsoft.graph.group" }
\# Convertir a lista legible:
\$groups | Select-Object DisplayName, Id, SecurityEnabled | Sort-Object DisplayName
¿Por qué “transitive”?
Las organizaciones suelen anidar grupos (por ejemplo, Recursos Humanos dentro de Empleados). El cmdlet “transitive” garantiza que capturas las membresías directas e indirectas en un único barrido, evitando huecos de seguridad en informes o asignaciones de licencias.
Ejemplo con Azure CLI
# Login interactivo o servicio:
az login
Lista de IDs de grupo (directos e indirectos):
az ad user get-member-groups --id user@contoso.com --security-enabled-only false --output tsv
Unir nombre legible:
for id in $(az ad user get-member-groups --id user@contoso.com --security-enabled-only false --output tsv); do
az ad group show --group $id --query "{Name:displayName, ObjectId:id}"
done
Para scripts multiplataforma (Linux, WSL, macOS) este enfoque evita depender de PowerShell.
Uso del Portal de Azure para auditorías rápidas
Cuando solo necesitas comprobar uno o dos usuarios, el Portal sigue siendo la vía más sencilla:
- Abre Azure Active Directory > Usuarios.
- Selecciona el usuario deseado.
- Haz clic en Grupos.
- El panel muestra solo las membresías directas; los grupos anidados no aparecen. Haz clic en un grupo para explorar su jerarquía.
Llamadas REST con curl o Postman
Si prefieres controlar cabeceras o integrar con un backend que no ejecuta PowerShell, una solicitud HTTP GET
es suficiente:
GET https://graph.microsoft.com/v1.0/users/8d4b46c5-xxxx-xxxx-xxxx-a4962e3520e3/transitiveMemberOf
Authorization: Bearer <access_token>
Entre los valores útiles del cuerpo JSON encontrarás:
- displayName: nombre del grupo.
- mailNickname: alias (útil para Teams).
- securityEnabled:
true
= grupo de seguridad. - membershipRule: muestra la regla KQL de un grupo dinámico.
Automatización y desencadenadores
Obtener la lista de grupos es solo el primer paso. Ideas de aplicación:
- Provisión Just‑in‑Time: consulta los grupos durante el inicio de sesión y asigna recursos en función del resultado.
- Revisión de acceso: exporta las membresías a un CSV, envíalo a supervisores y automatiza la revocación con PowerShell.
- Asignación de licencias: usa Grupos Dinámicos + filtro “UserType eq ‘Member’” para licenciar nuevos empleados sin intervención humana.
Buenas prácticas de rendimiento
- Aplica el parámetro
$select
para limitar atributos y reducir la latencia:?$select=id,displayName,securityEnabled
. - Paginación: Microsoft Graph devuelve 100 objetos por página; sigue el vínculo
@odata.nextLink
o usa el interruptor-All
en PowerShell Graph. - Evita la sobrecarga de endpoints antiguos (
https://graph.windows.net
) ya que están en desuso.
Seguridad y gobernanza
Conceder Directory.Read.All a una aplicación equivale a mostrar el organigrama completo. Asegúrate de:
- Limitar el Client Secret a 6‑12 meses y rotarlo automáticamente.
- Restringir el ámbito mediante Conditional Access (por ejemplo, solo desde redes de confianza).
- Registrar las llamadas en Azure Monitor y establecer alertas de actividad inusual.
Errores frecuentes
“Authentication_RequestDenied” Ocurre cuando intentas leer otro usuario con permisos escasos. Añade Directory.Read.All
o pide al administrador una función privilegiada. Lista vacía al usar Get-MgUserMemberOf
El cmdlet solo devuelve membresías directas. Cambia a Get-MgUserTransitiveMemberOf
si hay grupos anidados. CLI: “The user does not have access to this tenant.” Verifica que tu sesión az login
apunte al directorio correcto: az account set --subscription <id>
.
Resumen
Llevar un inventario completo de grupos en Azure AD requiere pasarse al lenguaje de Microsoft Graph. Con PowerShell (AzureAD o Graph), Azure CLI, Portal o llamadas REST podrás suplir las carencias de whoami
y, además, automatizar licencias, revisar accesos y cumplir auditorías de seguridad. Elige la herramienta que mejor encaje con tu flujo de trabajo, aplica permisos mínimos y saca partido a los cmdlets transitive para no dejar fuera ningún grupo.