Obtener la pertenencia a grupos en Azure AD: métodos PowerShell, CLI y Graph

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

Índice

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ónComando / rutaNotas rápidas
PowerShell (AzureAD)Get-AzureADUserMembership -ObjectId user@contoso.comIncluye 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 Azureaz ad user get-member-groups --id user@contoso.com --security-enabled-only falseDevuelve los ids de grupo; combínalo con az ad group show para obtener nombres descriptivos.
Portal de AzureAzure Active Directory → Usuarios → (usuario) → GruposVista 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:

  1. Abre Azure Active Directory > Usuarios.
  2. Selecciona el usuario deseado.
  3. Haz clic en Grupos.
  4. 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.

Índice