Generar informes con Get-AdGroupMember en PowerShell

A popular use of PowerShell is working with Active Directory Directory Services (AD). There are so many time-saving things PowerShell can do with AD objects. Using the PowerShell Get-ADGroupMember cmdlet and other cmdlets can save you a ton of time.

Grupos de Active Directory son una excelente manera de segmentar las cuentas de usuario. Los grupos permiten a los administradores definir el acceso a recursos en muchos sistemas.

En este artículo, usemos PowerShell para obtener los miembros del grupo de AD y exportar esos miembros. Puedes utilizar esta información para generar una variedad de informes interesantes.

Active Directory group

Administra e informa sobre Active Directory, Exchange y Microsoft 365 con ManageEngine ADManager Plus. ¡Descarga la prueba gratuita!

Requisitos previos

Si deseas seguir este artículo, asegúrate de tener los siguientes requisitos listos:

Aprendiendo lo básico

Para consultar grupos de AD y sus miembros, dispones de dos cmdlets de PowerShell: Get-AdGroup y Get-AdGroupMember.

Get-ADGroup consulta a un controlador de dominio y devuelve objetos de grupo AD. Get-AdGroupMember examina cada grupo y devuelve todas las cuentas de usuario, grupos, contactos y otros objetos que existen en ese grupo.

Obteniendo Grupos AD

Para encontrar grupos AD con PowerShell, puedes utilizar el cmdlet Get-ADGroup. Sin parámetros, Get-ADGroup consultará AD y devolverá todos los grupos en un dominio utilizando el parámetro Filtro. El parámetro Filtro es obligatorio. Existe para limitar los grupos devueltos en función de varios criterios.

Por ejemplo, para encontrar todos los grupos sin tener en cuenta ningún criterio, utiliza Get-ADGroup y especifica un comodín (asterisco) para el parámetro Filtro. Puedes ver un ejemplo a continuación. Recorrer todos estos grupos puede llevar un tiempo si tienes cientos o incluso miles en tu dominio.

Get-ADGroup -Filter *

Si necesitas encontrar un solo grupo, puedes utilizar el parámetro Identidad.

El parámetro Identidad es un parámetro común entre todos los cmdlets de PowerShell de Active Directory. Te permite limitar tu consulta a un único objeto AD. Por ejemplo, si necesitas verificar si existe un grupo llamado HR, podrías averiguarlo ejecutando el comando a continuación.

Get-ADGroup -Identity 'HR'

Obteniendo Miembros de Grupo AD con Get-AdGroupMember

Usar PowerShell para listar miembros de un grupo de AD requiere el cmdlet Get-ADGroupMember. Este cmdlet obtiene objetos de usuario, grupo y computadora en un grupo particular. Quizás necesites encontrar todos los miembros del grupo Administradores. En su forma más simple, simplemente usarías el parámetro Identity especificando nuevamente el nombre del grupo como se muestra a continuación.

Get-ADGroupMember -Identity 'Administrators'

Ten en cuenta que Get-AdGroupMember solo devuelve la membresía de grupo para usuarios, grupos y computadoras. No devolverá otros objetos de AD como contactos.

Enumerando Miembros de Grupo dentro de Miembros de Grupo

Como sabrás, los grupos de AD no solo pueden contener cuentas de usuario sino también otros grupos, lo que se llama anidación. Cuando un grupo está anidado dentro de otro grupo, los miembros de ese grupo heredan los mismos permisos asignados al grupo padre.

Por defecto, el cmdlet de PowerShell Get-AdGroupMember no devuelve miembros de grupo anidados. Para remediar eso, puedes usar el parámetro Recursive. Por ejemplo, podrías encontrar miembros de grupos anidados dentro del grupo HR usando el parámetro Recursive como se muestra a continuación.

Get-ADGroupMember -Identity 'HR' -Recursive

Obteniendo Múltiples Grupos/Miembros a la Vez

Si necesita consultar AD para muchos grupos o miembros de grupos diferentes a la vez, también puede hacerlo usando un bucle foreach de PowerShell. Un bucle foreach ejecuta un comando o código para cada elemento en una colección. En este caso, esa colección será una lista de nombres de grupos.

Tal vez necesite encontrar todos los miembros del grupo en los grupos RRHH, Contabilidad, y TI. Para hacer eso, primero crearía una colección o array con estos nombres de grupo. El ejemplo a continuación define esta colección como $groupNames. Luego, para cada nombre en esa colección, ejecute Get-ADGroupMember proporcionando el nombre de cada grupo al parámetro Identity.

$groupNames = 'HR','Accounting','IT'
foreach ($group in $groupNames) {
    Get-ADGroupMember -Identity $group
}

También podría usar el ForEach-Object cmdlet para iterar sobre grupos.

Usando Credenciales Alternativas

Al igual que muchos otros cmdlets de PowerShell, los cmdlets de grupo de AD tienen un parámetro Credential. Por defecto, cada vez que ejecuta un cmdlet de grupo de AD, usa sus credenciales iniciadas sesión para consultar Active Directory. Este comportamiento dicta que necesita estar en un equipo unido al dominio iniciado sesión como un usuario de Active Directory que tenga permiso.

Pero, ¿qué pasa si estás en una computadora de grupo de trabajo o necesitas autenticarte en Active Directory como un usuario diferente? En ese caso, puedes usar el parámetro Credential. Este parámetro te permite especificar un nombre de usuario y una contraseña para la autenticación.

Por ejemplo, tal vez tu cuenta de usuario no tiene los permisos necesarios para realizar una tarea en Active Directory. Tienes una cuenta de servicio con derechos adicionales. Puedes estar conectado como un usuario estándar y aún así autenticarte con la cuenta de servicio, como se muestra a continuación.

El cmdlet Get-Credential solicita un nombre de usuario/contraseña para crear una credencial. Luego, esta credencial se pasa al cmdlet Get-AdGroup para la autenticación.

Get-ADGroup -Identity 'HR' -Credential (Get-Credential)

El parámetro Credential es ubicuo en PowerShell para proporcionar credenciales de autenticación. Para obtener más información, lee Utilizando el cmdlet Get-Credential de PowerShell y todo lo relacionado con credenciales.

¿Cómo obtener miembros de un grupo con Get-ADGroup?

Puede sonar contradictorio, pero también puedes obtener miembros de un grupo con el cmdlet Get-ADGroup.

Resulta que Get-ADGroup devuelve una propiedad para cada grupo llamada members. Esta es una colección de objetos AD que son miembros de un grupo.

Por ejemplo, para encontrar miembros del grupo HR nuevamente sin usar Get-ADGroupMember, podrías hacer algo como esto:

Get-ADGroup -Identity 'HR' -Properties members

¿Por qué usar este método sobre el otro? La principal diferencia es que las propiedades members contienen todos los tipos de objetos AD, no solo usuarios, computadoras y otros grupos.

Tal vez tengas contactos dentro de varios grupos. Cuando ejecutas Get-ADGroupMember, esos contactos no aparecerían. Pero si le dices a Get-ADGroup que devuelva todos los miembros en ese grupo junto con la expansión de esa colección como se muestra a continuación, verás los contactos.

Get-ADGroup -Identity 'HR' -Properties members | Select-Object -ExpandProperty members

Encontrar Atributos AD Específicos

En la sección de conceptos básicos anterior, simplemente estabas devolviendo todos los grupos y miembros del grupo. La información devuelta para cada grupo y miembro del grupo es solo un subconjunto de los atributos AD asociados con cada tipo de objeto.

Tal vez quieras ver la dirección de correo electrónico de una cuenta de usuario, la fecha del último inicio de sesión u otro atributo AD asociado. Para hacer esto, necesitarás ser creativo.

Tal vez pudiste encontrar todos los miembros del grupo RRHH pero necesitas también ver la dirección de correo electrónico de cada cuenta de usuario.

$groupMembers = (Get-ADGroup -Identity 'HR' -Properties members).members
$groupMembers | Select-Object -Property Name, @{Name='Member';exp={Get-AdUser -Identity $_.Name -Properties emailAddress,lastlogonDate}}

Filtrar Resultados

Hasta este punto, has encontrado todos los grupos y miembros del grupo, pero en un entorno de trabajo diario, rara vez necesitarás hacer esto. Lo más probable es que solo necesites encontrar un número limitado de cada elemento. Los cmdlets de grupo de AD tienen algunas formas de manejar esto.

El Parámetro Filtro

Como se mencionó anteriormente, ambos cmdlets tienen el parámetro Filtro. Este parámetro te permite limitar lo que se devuelve de muchas maneras diferentes fuera del alcance de este artículo.

Usando el parámetro Filter, puedes limitar los resultados por cualquier atributo de AD, como nombre, tipo de grupo, dirección de correo electrónico, último inicio de sesión para usuarios, etc.

Por ejemplo, tal vez quieras encontrar solo grupos de seguridad. En ese caso, especificarías un atributo GroupCategory y establecerías una condición para asegurarte de que solo se devuelvan grupos de Security.

Get-ADGroup -Filter 'GroupCategory -eq "Security"'

Tal vez quieras encontrar todos los grupos de seguridad pero que no sean grupos locales de dominio. Luego agregarías otra condición (esta vez usando el operador -ne) para evitar que se devuelvan grupos locales de dominio.

Get-ADGroup -Filter 'GroupCategory -eq "Security" -and GroupScope -ne "DomainLocal"'

Si deseas aprender cómo crear filtros de consulta, asegúrate de consultar Aprendiendo Filtros de Active Directory y LDAP en PowerShell.

Limitando los Resultados de Grupo por Unidad Organizativa (OU)

Tal vez tengas varios grupos anidados en OUs. No necesariamente quieres encontrar todos los grupos sino solo los grupos en una OU específica. En ese caso, puedes usar el parámetro SearchBase.

El parámetro SearchBase te permite especificar el nombre distintivo (DN) de una OU para comenzar a buscar grupos. Por ejemplo, tal vez tengas una OU llamada Locations en la raíz de tu dominio. En la OU Locations, tienes cada OU de ubicación creada como Austin, NYC, y Los Angeles. Solo estás buscando grupos en la OU NYC y necesitas restringir la vista de los demás.

A continuación se muestra una estructura de OU de AD de ejemplo. Observa que existen otros grupos fuera de las OUs de Locations.

company.local
- Locations
  - Austin
  - NYC
    - Group 1
    - Group 2
  - Los Angeles
- Computers
  - Group 3
  - Group 4
- Service Accounts

Quizás necesites encontrar todos los grupos de AD que están únicamente en la OU de NYC. Para limitar la consulta, usarías el parámetro SearchBase proporcionando el DN como se muestra a continuación. Todos los grupos dentro de la OU de Locations son devueltos.

Get-ADGroup -Filter '*' -SearchBase 'OU=Locations,OU=NYC,DC=company,DC=pri'

Pero ahora necesitas encontrar todos los grupos en todas las UOs bajo la OU de Locations. Get-ADGroup solo devuelve grupos en la OU de Locations en sí misma, no en las UOs hijas.

Para devolver grupos dentro de UOs hijas, necesitarías usar el parámetro SearchScope. Este parámetro es similar al parámetro Recursive en el sentido de que inspeccionará también objetos hijos.

Por ejemplo, para encontrar todos los grupos en cualquier OU bajo la OU de Locations, especifica Subtree o 2. Este valor para SearchScope le indica a Get-ADGroup que busque recursivamente en todos los hijos, nietos y así sucesivamente de las UOs.

Get-ADGroup -Filter '*' -SearchBase 'OU=Locations,DC=company,DC=pri' -SearchScope 2

Para obtener un desglose completo de las opciones del parámetro SearchScope, consulta la documentación de Get-ADGroup.

Exportación de Grupos de AD y Miembros

Así que finalmente sabes cómo consultar y devolver los grupos y miembros de grupo que necesitas. Toda esta información se envía a la consola de PowerShell. Pero ahora necesitas llevar esta información a un archivo CSV o una hoja de Excel.

Lo único que necesitas hacer ahora es enviar toda esa información a un archivo.

Exportación a un CSV

Un formato popular para exportar información de AD es un CSV. PowerShell tiene un útil cmdlet que te permite crear fácilmente archivos CSV a partir de la salida de PowerShell llamado Export-Csv.

Puedes crear un archivo CSV desde cualquier comando cubierto en este artículo mediante la canalización a Export-Csv. Utilizando el ejemplo a continuación, redireccionarás toda la salida que Get-AdGroup hubiera devuelto a la consola, a un archivo CSV en su lugar.

Get-ADGroup -Filter '*' -SearchBase 'OU=Locations,DC=company,DC=pri' -SearchScope 2 | Export-Csv -Path 'departmental_groups.csv' -NoTypeInformation

Para obtener más información sobre este útil cmdlet, consulta Export-Csv: La forma PowerShell de tratar los archivos CSV como ciudadanos de primera clase.

También puedes exportar fácilmente los resultados a CSV mediante el cmdlet Get-AdGroupMember.

Exportar a Excel

PowerShell no tiene una forma nativa de exportar información a Excel. Sin embargo, siempre puedes descargar el módulo de la comunidad gratuito llamado ImportExcel. Este módulo trae capacidades de exportación similares a CSV directamente a las hojas de cálculo de Excel. Para instalar el módulo PowerShell, ejecuta Install-Module ImportExcel -Scope CurrentUser.

Usando el ejemplo anterior, en lugar de un archivo CSV, si necesitaras exportar los grupos a una hoja de cálculo de Excel, usarías el cmdlet Export-Excel como se muestra a continuación.

Encuentra contraseñas filtradas y no seguras en tu Directorio Activo comprobando contra la lista de contraseñas de NCSC.

Get-ADGroup -Filter '*' -SearchBase 'OU=Locations,DC=company,DC=pri' -SearchScope 2 | Export-Excel -Path 'departmental_groups.csv'

El módulo ImportExcel ofrece una gran cantidad de funcionalidades para trabajar con Excel. Si necesitas una hoja de cálculo más sofisticada, probablemente tenga una función para ti.

Para obtener más información sobre el uso del módulo ImportExcel, lee este artículo. Proporciona una excelente introducción a algunos casos de uso comunes que puede manejar.

Administra e informa sobre Active Directory, Exchange y Microsoft 365 con ManageEngine ADManager Plus. ¡Descarga la prueba gratuita!

Conclusión

Con solo dos cmdlets de PowerShell, puedes hacer prácticamente cualquier cosa con los grupos de AD. Este artículo fue solo una introducción a la funcionalidad disponible para ti. Utiliza los conocimientos recopilados aquí, sigue algunos de los enlaces a temas más profundos en el artículo y ¡descubre lo que puedes construir!

Source:
https://adamtheautomator.com/get-adgroupmember/