Obtener la membresía de la lista de distribución en línea de Exchange cuenta con PowerShell
Cómo sacar adelante viejos guiones
Recientemente, escribí sobre el cmdlet New-DistributionGroup y expliqué cómo las listas de distribución siguen siendo tan útiles, incluso cuando Microsoft impulsa los Grupos de Microsoft 365 como la respuesta a todos los problemas de colaboración. Un lector rápidamente escribió para decir que los grupos de distribución son diferentes en Exchange Online que en Exchange Server y señaló que los scripts de PowerShell escritos para consumo local a menudo no funcionan en la nube. Incluso citaron como ejemplo un artículo de Practical 365 de 2015 que explica cómo informar el número de miembros en las listas de distribución.
El script tiene como objetivo resaltar grandes listas de distribución del tipo que potencialmente podrían causar tormentas de correo de Responder a todos. Microsoft actualizó recientemente la configuración de control de respuesta a todos para Exchange Online para hacer que las tormentas de correo sean menos probables, pero no hay duda de que es una buena idea saber si existen listas de distribución muy grandes y, lo que es más importante, quién cuida de estos monstruos.
Suelte Get-Mailbox; Ya tuvo su momento: lea más sobre cómo mover scripts de Exchange Online para usar Get-ExoMailbox
La diferencia entre Get-ADGroupMember y Get-AzureADGroupMember
El script original se basa en la capacidad del cmdlet Get-ADGroupMember (para Active Directory) para recuperar miembros de la lista de distribución de forma recursiva. En otras palabras, si una lista de distribución contiene listas de distribución anidadas, debe obtener detalles de todos los miembros para saber cuántos destinatarios recibirán los mensajes enviados a la lista. El servicio de transporte Exchange amplía las listas de distribución durante su proceso de distribución para crear copias de mensajes para los destinatarios, y es entonces cuando se conoce el número total de destinatarios.
El problema de llevar el script original a la nube es que el cmdlet equivalente Get-AzureADGroupMember no maneja la recursividad. La API Graph para grupos tiene una llamada transitiveMembers para devolver "una lista plana de todos los miembros anidados", pero esa capacidad no ha llegado al cmdlet de PowerShell. Para mostrar cómo funcionan los miembros transitivos, la Figura 1 muestra el resultado de una llamada a https://graph.microsoft.com/v1.0/groups/4f6a1e58-84cc-4365-b339-7520508c1cbc/transitiveMembers para recuperar miembros de una lista de distribución que contiene listas anidadas utilizando la herramienta Graph Explorer.
Si nunca ha usado Graph Explorer, debería dedicar algo de tiempo a acostumbrarse a él porque es una excelente manera de aprender a interactuar con las llamadas de Graph API.
Grupos y listas
Las listas de distribución son objetos habilitados para correo de Exchange y existen tanto en el directorio de Exchange Online (EXODS) como en Azure AD. Se denominan listas de distribución en el mundo de Exchange y grupos de distribución en general en Microsoft 365, o simplemente grupos dentro de Azure AD. Los Grupos de Microsoft 365 son mucho más fáciles de procesar cuando se trata de recuentos de miembros. Primero, no puedes anidar Grupos de Microsoft 365. En segundo lugar, sólo las cuentas de inquilinos e invitados pueden ser miembros. En tercer lugar, el cmdlet Get-UnifiedGroup devuelve recuentos de miembros inquilinos y miembros invitados. Consulte este artículo para ver un ejemplo de cómo informar la membresía de Grupos de Microsoft 365.
Regresar a PowerShell
Es sencillo escribir un script para usar Graph API para obtener la membresía de listas de distribución anidadas, pero volvamos al PowerShell básico y consideremos qué podemos hacer para resolver el mismo problema que Get-ADGroupMember. en las instalaciones.
En este artículo, Vasil Michev analiza en profundidad los problemas relacionados con la generación de una lista de todos los miembros de todos los grupos de una organización, incluidos los Grupos de Microsoft 365, las listas de distribución dinámica, etc. Aunque podríamos adaptar el guión de Vasil para hacer lo que queramos, eso no tiene nada de divertido, así que dediqué aproximadamente una hora a encontrar una solución al problema de identificar grandes listas de distribución.
La primera regla de un hacker exitoso de PowerShell es nunca recrear la rueda. Siempre comience un proyecto de codificación buscando qué han hecho las personas para resolver un problema, o al menos parte del problema, al que se enfrenta. En este caso, una búsqueda para descubrir cómo las personas manejaban la cuestión del manejo de grupos anidados de Azure AD arrojó varias funciones útiles, incluida una que decidí usar en mi script.
La solución recién codificada
El código es razonablemente simple. Primero, busque todas las listas de distribución del inquilino, excluidas las utilizadas para las listas de habitaciones.
Para cada lista, encontramos su membresía. En este ejemplo, uso Get-AzureADGroupMember en lugar de Get-DistributionGroupMember. Cualquiera de los dos funcionará. Mi decisión se debió al hecho de que la función que adapté utilizaba Azure AD. Encontrar la membresía implica determinar qué miembros son simples (cuentas de usuario, cuentas de invitados y contactos de correo) y cuáles son grupos. La membresía de cada grupo anidado se resuelve y se agrega a la membresía general. Al final, el script elimina cualquier entrada duplicada de la membresía.
Después de procesar una lista de distribución, el script extrae algunas estadísticas sobre la cantidad de miembros, cuentas de inquilinos, cuentas de invitados, grupos y "otros" (principalmente contactos de correo). El script también genera una lista de miembros. Esta información se almacena en una lista de PowerShell.
Una vez que el script ha procesado todas las listas de distribución, genera un archivo CSV y muestra los resultados a través del cmdlet Out-GridView (Figura 2).
Puede descargar dos versiones del script desde GitHub. El primero (descrito en este artículo) utiliza Exchange Online PowerShell; el segundo utiliza una combinación de solicitudes de PowerShell y Graph API. Siéntase libre de mejorar el código en cualquiera de los dos y hacer que los scripts cumplan con sus requisitos. La cuestión es que el código de PowerShell es muy adaptable para diferentes propósitos, que así debe ser.

