PowerShell: Como obtener los miembros de los grupos de distribución existentes en Office 365

En esta entrada voy a mostraros un script con el que podéis obtener todos los miembros que componen los distintos grupos de distribución existentes en Office 365.

El proceso es muy sencillo, simplemente tenéis que abrir un bloc de notas, copiar el script que os voy a mostrar a continuación y guardar el archivo con el nombre que queráis con extensión ps1

Es importante que este fichero los guardéis en una carpeta donde tengáis permisos de escritura. Por defecto el fichero CSV resultante se guardará en la misma carpeta donde se encuentre el script.

Si queréis cambiar la ubicación donde se generará el CSV simplemente tendréis que establecer la ruta completa modificando el valor de la variable $OutputFile

#Parametros de Entrada
#Este script acepta 2 parametros opcionales como son el login y la contrasena del usuario administrador que utilizaremos para conectarnos a nuestro tenant
Param( 
    [Parameter(Position=0, Mandatory=$false, ValueFromPipeline=$true)] 
    [string] $Office365Username, 
    [Parameter(Position=1, Mandatory=$false, ValueFromPipeline=$true)] 
    [string] $Office365Password 
) 
 
#En esta variable pondremos la ruta o el nombre del fichero CSV resultante de la consulta
#En el caso de no especificar una ruta el fichero se genera en la misma ruta donde se encuentre este script
$OutputFile = "Listado_Miembros_Grupos.csv"
$arrDLMembers = @{} 
 
#Eliminamos las sesiones existentes de PowerShell en caso de que existan
Get-PSSession | Remove-PSSession 
 
#Sino hemos pasado por parametros las credenciales para conectar al tenant se nos requira
if (([string]::IsNullOrEmpty($Office365Username) -eq $false) -and ([string]::IsNullOrEmpty($Office365Password) -eq $false))
{
    $SecureOffice365Password = ConvertTo-SecureString -AsPlainText $Office365Password -Force     
     
    $Office365Credentials  = New-Object System.Management.Automation.PSCredential $Office365Username, $SecureOffice365Password 
}
else
{
    $Office365Credentials  = Get-Credential
}
#Creamos la sesion con nuestro Tenant
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $Office365credentials -Authentication Basic –AllowRedirection         

#Importamos la sesion
Import-PSSession $Session -AllowClobber | Out-Null          
 
#Preparamos las cabeceras de nuestro fichero CSV
Out-File -FilePath $OutputFile -InputObject "Distribution Group DisplayName,Distribution Group Email,Member DisplayName, Member Email, Member Type" -Encoding UTF8 
 
#Obtenemos todos los grupos de distribucion existente en Office 365 
$objDistributionGroups = Get-DistributionGroup -ResultSize Unlimited 
 
#Recorremos uno a uno cada grupo para ir obteniendo los usuarios
Foreach ($objDistributionGroup in $objDistributionGroups) 
{     
	write-host "Procesando $($objDistributionGroup.DisplayName)..." 
 
	#Obtenemos los miembros del grupo
	$objDGMembers = Get-DistributionGroupMember -Identity $($objDistributionGroup.PrimarySmtpAddress) 
	 
	write-host "Encontrados $($objDGMembers.Count) miembros..." 
	 
	#Recorremos cada uno de los miembros para obtener su informacion
	Foreach ($objMember in $objDGMembers) 
	{ 
		Out-File -FilePath $OutputFile -InputObject "$($objDistributionGroup.DisplayName),$($objDistributionGroup.PrimarySMTPAddress),$($objMember.DisplayName),$($objMember.PrimarySMTPAddress),$($objMember.RecipientType)" -Encoding UTF8 -append 
		write-host "`t$($objDistributionGroup.DisplayName),$($objDistributionGroup.PrimarySMTPAddress),$($objMember.DisplayName),$($objMember.PrimarySMTPAddress),$($objMember.RecipientType)"
	} 
} 

#Cerramos la conexion con el tenant de Office 365
Get-PSSession | Remove-PSSession 

Una vez tenemos guardado nuestro script, lo ejecutaremos haciendo doble clic sobre él.

A continuación nos solicitará las credenciales de una cuenta con permisos para acceder a nuestro tenant de Office 365, introducimos las credenciales y pulsamos en Aceptar.

Y listo ya sólo tendremos que esperar a que se genere nuestro fichero CSV el cual contendrá todos los grupos de distribución que tengamos en Office 365 con cada uno de los miembros que lo forman.

Espero os sea de utilidad.

Entradas relacionadas

17 comentarios en «PowerShell: Como obtener los miembros de los grupos de distribución existentes en Office 365»

  1. Hola Sergio si requiero solo extraer información de un usuario en particular? (grupos de distribución y grupos de seguridad al cual pertenece) es posible??

    desde ya muchas gracias

    Responder
    • Hola Norman,

      Es posible pero habría que crear el script y ahora mismo no lo tengo hecho, me lo apunto para una futura entrada. Mientras tanto puedes realizar la exportación tal y como indico en la entrada y una vez lo tengas todo en Excel aplicar un filtro de Excel sobre la columna donde se encuentra los usuarios para que sólo te muestre las filas donde se encuentre.

      Saludos.

      Responder
      • hola sergio gracias por tu pronta respuesta, este es el error

        Import-PSSession : No se pueden cargar los archivos porque la ejecución de scripts está deshabilitada en este
        sistema. Proporcione un certificado válido con el que firmar los archivos.
        En línea: 33 Carácter: 1
        + Import-PSSession $Session -AllowClobber | Out-Null
        + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo : InvalidOperation: (:) [Import-PSSession], PSInvalidOperationException
        + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.ImportPSSessionCommand

        Get-DistributionGroup : El término ‘Get-DistributionGroup’ no se reconoce como nombre de un cmdlet, función, archivo
        de script o programa ejecutable. Compruebe si escribió correctamente el nombre o, si incluyó una ruta de acceso,
        compruebe que dicha ruta es correcta e inténtelo de nuevo.
        En línea: 39 Carácter: 26
        + $objDistributionGroups = Get-DistributionGroup -ResultSize Unlimited
        + ~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo : ObjectNotFound: (Get-DistributionGroup:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException

        Responder
        • Hola Ezequiel,

          Por el log que me pones veo varios errores:

          1º Tienes deshabilitada la ejecución de script por lo que deberías habilitarla para ello en este enlace puede ver una entrada de blog donde explico como hacerlo. Una vez habilitado prueba a ejecutar nuevamente el script antes de hacer el paso 2 ya que muchas veces en Powershell cuando hay un fallo ya no te reconoce nada más, sino te funcionará entonces sigue con el paso 2.
          2º Parece que te falta instalar en PowerShell los paquetes necesarios para conectar con Exchange Online de Office 365. Te dejo el siguiente enlace de Microsoft donde puedes descargar e instalar el paquete que creo te hace falta.

          Espero con se resuelvan tus problemas.
          Saludos.

          Responder
  2. Buenas Tardes ,
    amigo realizo todos los pasos y me da el siguiente mensaje ,sabra a que se debe y como corregirlo.

    ANEXO DETALLES DEL ERROR

    ADVERTENCIA: Algunos nombres de comando importados del módulo ‘tmp_rorxsudc.qmo’ incluyen verbos no aprobados que
    podrían dificultar su reconocimiento. Para encontrar los comandos con verbos no aprobados, vuelva a ejecutar el comando
    Import-Module con el parámetro Verbose. Para obtener una lista de verbos aprobados, escriba Get-Verb.

    Responder
    • Hola Freddy,

      ¿Podría ejecutar el comando Import-Module con el parámetro Verbose para ver que comandos son los que no te reconoce?.

      Saludos.

      Responder
    • Hola Ezequiel,

      No sabría decirte, lo único que se me ocurre es que sea un problema de permisos pero sin verlos es difícil conocer la causa.

      Saludos.

      Responder
  3. Hola, muy bueno el script que haz compartido. ¿Tienes alguno similar pero que obtengas los miembros de los grupos de 365?

    Responder
    • Hola Mayra,

      Ahora mismo no tengo ninguna entrada para obtener exactamente lo que necesitas, no obstante, me lo apunto para hacerla proximamente.

      Saludos.

      Responder
  4. Hola estoy ejecutando el script me aparece este error:

    New-PSSession : [outlook.office365.com] Error de conexión al servidor remoto outlook.office365.com. Mensaje de error:
    Acceso denegado. Para obtener más información, consulte el tema de la Ayuda about_Remote_Troubleshooting.
    En C:\Users\BryanCamiloBeltránCa\Downloads\Export_member_DistributionGroup.ps1: 46 Carácter: 14
    + … PSSession = New-PSSession -ConfigurationName Microsoft.Exchange -Conn …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : OpenError: (System.Manageme….RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotin
    gTransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionOpenFailed
    Import-PSSession : No se puede validar el argumento del parámetro ‘Session’. El argumento es null. Proporcione un
    valor válido para el argumento e intente ejecutar el comando de nuevo.
    En C:\Users\BryanCamiloBeltránCa\Downloads\Export_member_DistributionGroup.ps1: 47 Carácter: 18
    + Import-PSSession $PSSession
    + ~~~~~~~~~~
    + CategoryInfo : InvalidData: (:) [Import-PSSession], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.ImportPSSessionCommand

    System.Management.Automation.CommandNotFoundException: El término ‘Get-UnifiedGroup’ no se reconoce como nombre de un cmdlet, función, archivo de script o programa ejecutable. Compruebe si escribió correctamente el nombre o, si incluyó una ruta de acceso, compruebe que dicha ruta es correcta e inténtelo de nuevo.
    en System.Management.Automation.ExceptionHandlingOps.CheckActionPreference(FunctionContext funcContext, Exception exception)
    en System.Management.Automation.Interpreter.ActionCallInstruction`2.Run(InterpretedFrame frame)
    en System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
    en System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)

    Responder
    • Hola Edward,

      Parece un problema de permisos del usuarios que estás utilizando para realizar la conexión, revísalo porque debe faltarle algún tipo de permiso a nivel de Exchange a ese usuario.

      Saludos.

      Responder

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.