Domina tus Filtros LDAP en PowerShell mientras Aprendes AD

Uno de los obstáculos más comunes al consultar Active Directory con PowerShell es cómo construir correctamente la sintaxis del filtro. El parámetro Filter y los parámetros de filtro LDAP en todos los cmdlets del módulo ActiveDirectory de PowerShell son una caja negra para muchos.

En esta publicación de blog, vamos a sumergirnos en la comprensión de cómo usar los filtros de Active Directory. Espero que al final de esta publicación, ya no intentes usar ese Where-Object y filtro correctamente!

Prerrequisitos

Para que funcione cualquiera de los códigos que estoy a punto de mostrarte, asumiré algunas cosas:

Hay dos lenguajes de filtro diferentes que puedes usar al buscar objetos utilizando muchos de los cmdlets de Active Directory: filtros de PowerShell y filtros LDAP.

Filtros de PowerShell

Los filtros de PowerShell utilizan la sintaxis estándar de expresión de PowerShell. Comúnmente se conoce como sintaxis de filtro de búsqueda de Active Directory.

Estos filtros se utilizan con el parámetro Filter. La sintaxis del parámetro Filter

Operadores

Mientras construyes un filtro para el parámetro Filter, necesitarás utilizar al menos un operador. Los operadores utilizados aquí son los operadores familiares que podrías estar acostumbrado a utilizar cuando usas comandos como Where-Object.

Dentro del parámetro Filter, puedes utilizar los siguientes operadores.

Operator Explanation
-eq Equal to
-le Less than or equal to
-ge Greater than or equal to
-ne Not equal to
-lt Less than
-gt Greater than
-approx Approximately equal to
-bor Bitwise OR
-band Bitwise AND
-recursivematch Recursive match
-like Like
-notlike Not like
-and Boolean AND
-or Boolean OR
-not Boolean NOT

Referencia Propiedades del Objeto AD

Dentro del filtro, compararás varias propiedades de objetos AD utilizando operadores. Por ejemplo, el cmdlet Get-AdUser devuelve una propiedad Name. Si deseas encontrar todos los usuarios que coincidan con un nombre específico, usarías:

PS51> Get-Aduser -Filter "Name -eq 'Adam Bertram'"

Los nombres de las propiedades pueden ser el nombre o el nombre del filtro LDAP de la propiedad devuelta con el cmdlet de AD.

Normalmente, los valores de las propiedades se envuelven entre comillas simples o dobles. El único comodín aceptado es el asterisco (*). Puedes ver arriba que el filtro está rodeado por comillas dobles, pero Adam Bertram está rodeado por comillas simples.

Ciertos caracteres deben ser ‘escapados’ cuando se utilizan en filtros. Estos son:

Character Escaped As Notes
`” Only required if the data is enclosed in double quotes.
\’ Only required if the data is enclosed in single quotes.
NUL \00 This is a standard LDAP escape sequence.
\ \5c This is a standard LDAP escape sequence.
* \2a Automatically escaped. Only in -eq and -ne comparisons. You should use -like and -notlike operators for wildcard comparison.
( /28 Automatically escaped.
) /29 Automatically escaped.
/ /2f Automatically escaped.

¿Qué es el Protocolo Ligero de Acceso a Directorios de Active Directory (LDAP)?

LDAP, o Lightweight Directory Access Protocol, es un protocolo neutral en cuanto a proveedores para acceder y modificar datos de directorio. Puedes pensar en una guía telefónica al escuchar la palabra directorio, pero en el contexto de Active Directory, esto significa mucho más. Muchos tipos diferentes de objetos son almacenados y accesibles mediante Active Directory con el protocolo LDAP funcionando como un medio para acceder a esos datos.

Dado que Active Directory puede almacenar muchos tipos diferentes de datos, las aplicaciones y los usuarios necesitan una forma de consultar ese directorio fácilmente. ¡Sigue leyendo para aprender cómo los Filtros LDAP ayudan a filtrar esos datos!

Filtros LDAP

Active Directory implementa LDAP, el Protocolo Ligero de Acceso a Directorios. Utilizar el parámetro LDAPFilter con los cmdlets te permite utilizar filtros LDAP, como los creados en Usuarios y Computadoras de Active Directory.

La sintaxis para los filtros LDAP está definida en RFC número 4515.

Cada regla de filtro está rodeada por paréntesis ( ). Las reglas de filtro pueden ser agrupadas rodeando el grupo entre paréntesis e incluyendo un comparador de los siguientes:

Operator Function
& and
| or
! not

Los filtros LDAP también tienen una regla de coincidencia especial Identificadores de Objetos (OID):

OID Purpose
1.2.840.113556.1.4.803 Bitwise AND
1.2.840.113556.1.4.804 Bitwise OR
1.2.840.113556.1.4.1941 Chain matching (for distinguished name attributes)

Existen cuatro tipos de filtros:

Operator Explanation
= Equal to
~= Approximately equal to
>= Greater than or equal to
<= Less than or equal to

Existen cuatro tipos de elementos:

Type Explanation
= Simple
=* Present
=something* Substring
Extensible varies depending on type

Las reglas de filtro LDAP deben usarse con los nombres LDAP de los atributos, y ciertos valores de caracteres deben ser ‘escapados’ si se utilizan en un filtro LDAP. Estos son:
assistant:

Character Escaped As
* \2a
( \28
) \29
\ \5c
NUL \00

Los valores de propiedad para comparación normalmente no necesitan estar entre comillas.

Ejemplos de Filtro LDAP

Construir filtros LDAP puede ser desafiante. Aquí hay algunos ejemplos utilizando filtros de grupos de directorio activo que puedes utilizar como base para comenzar a crear los tuyos propios.

  • Todos los grupos con un nombre (cn) de ‘Departamento de Servicios Profesionales’

    'cn -eq "Departamento de Servicios Profesionales"' o `'(cn=Departamento de Servicios Profesionales)'

  • Todos los grupos con un nombre de ‘Departamento de Servicios Profesionales’ y una descripción de ‘En Vivo’

    '(cn -eq "Departamento de Servicios Profesionales") -y (description -eq "En Vivo")' o '(&(cn=Departamento de Servicios Profesionales)(description=En Vivo))'

  • Todos los grupos con un nombre ya sea ‘Departamento de Servicios Profesionales’ o ‘Todos los Departamentos Comparten Acceso’

    '(cn -eq "Departamento de Servicios Profesionales") -o (cn -eq "Todos los Departamentos Comparten Acceso")' o '(|(cn=Departamento de Servicios Profesionales)(cn=Todos los Departamentos Comparten Acceso))'

  • Todos los grupos que no tengan una descripción de ‘En Vivo’. Incluye aquellos sin ningún campo de descripción en absoluto.

    '(!(description=En Vivo))'

  • Todos los grupos que no tengan una descripción de ‘En Vivo’. Excluye aquellos sin ningún campo de descripción en absoluto.

    'descripción -ne "En Vivo"'

  • Todos los grupos con una descripción de ‘En Vivo’ pero no con un nombre de ‘Departamento de Servicios Profesionales’.

    '(descripción -eq "En Vivo") -y (cn -ne "Departamento de Servicios Profesionales")' o '(&(description=En Vivo)(!(cn=Departamento de Servicios Profesionales)))'

  • Todos los grupos cuya descripción sea ‘\\fileserver1\fileshare’.

    'descripción -eq "\5c\5cfileserver1\5cfileshare"' o '(descripción=\5c\5cfileserver1\5cfileshare)'

Usar Coincidencia Recursiva o Coincidencia en Cadena

Usar una regla de coincidencia OID, o el parámetro RecursiveMatch es una forma poderosa de resolver una pregunta frecuentemente formulada sobre la consulta de AD: ‘¿Cómo puedo saber de todos los grupos de los que un usuario es miembro, tanto directa como indirectamente?’ Utilizas la propiedad de filtro de búsqueda de Active Directory memberOf para averiguarlo.

Usar una regla de coincidencia LDAP simple puede ser mucho más eficiente que un script grande. Usando nuestro ejemplo de dominio domain.local, Kristin Diaz es miembro directo del grupo de seguridad Departamento de Servicios Profesionales. Al observar su propiedad memberOf en AD se refleja esto; solo se muestra Departamento de Servicios Profesionales.

PS51> Get-ADUser -Identity Kristin.Diaz -Property memberOf

DistinguishedName : CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local
Enabled           : True
GivenName         : Kristin
MemberOf          : {CN=Professional Services Department,OU=All Groups,DC=domain,DC=local}
Name              : Diaz Kristin
ObjectClass       : user
ObjectGUID        : 04fe6336-c541-4e71-b7ed-6fee7db23482
SamAccountName    : Kristin.Diaz
SID               : S-1-5-21-447422785-3715515833-3878445295-1186
Surname           : Diaz
UserPrincipalName :

Al usar la regla de coincidencia OID, o el parámetro RecursiveMatch, descubrirá que son miembros indirectos de Acceso Compartido a Todos los Departamentos. Esto se debe a que el grupo Departamento de Servicios Profesionales es miembro de Acceso Compartido a Todos los Departamentos.

PS51> Get-ADGroup -LDAPFilter '(member:1.2.840.113556.1.4.1941:=CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local)'
PS51> Get-ADGroup -Filter 'member -RecursiveMatch "CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local"'

Ambos devuelven lo siguiente:

DistinguishedName : CN=All Departments Share Access,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : All Departments Share Access
ObjectClass       : group
ObjectGUID        : 8ac0e0b7-9225-40a4-b168-a0330960e182
SamAccountName    : All Departments Share Access
SID               : S-1-5-21-447422785-3715515833-3878445295-1254

DistinguishedName : CN=Professional Services Department,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : Professional Services Department
ObjectClass       : group
ObjectGUID        : a8432583-7cac-4e8e-8d94-51e1c5bb1989
SamAccountName    : Professional Services Department
SID               : S-1-5-21-447422785-3715515833-3878445295-1255

Los parámetros SearchBase y SearchScope

En entornos grandes, AD puede contener miles de objetos. Una forma de mejorar el rendimiento y reducir el número de objetos devueltos para cualquier consulta es limitar el ámbito de la búsqueda.

El parámetro SearchBase determina dónde en la jerarquía de AD comienza cualquier búsqueda. Al usar los cmdlets, esto es una representación de cadena de un nombre distinguido (y por defecto es la “parte superior” del dominio). También hay tres niveles de SearchScope:

  1. Base – El objeto que se ha especificado como el SearchBase.
  2. OneLevel – busca objetos contenidos inmediatamente por el SearchBase pero no en ningún subcontenedor.
  3. SubTree – busca objetos contenidos por el SearchBase y en cualquier subcontenedor, recursivamente a través de la jerarquía de AD.
Example OU Structure

En el ejemplo anterior, con el SearchBase configurado en OU=All User Accounts,DC=dominio,DC=local, un SearchScope de Base intentaría consultar el objeto OU en sí mismo, un SearchScope de OneLevel buscaría solo en la OU All User Accounts, y un SearchScope de SubTree buscaría tanto en las OUs All User Accounts como en Professional Services.

Resumen

Ahora deberías tener una buena comprensión de cómo filtrar con los cmdlets de PowerShell de Active Directory. Puedes ver que hay mucho en la elaboración de esa sintaxis de filtro perfecta. Es mucho más difícil construir el filtro adecuado que usar el cmdlet Where-Object.

¡Pero dedica tiempo a aprender la forma ‘correcta’ de filtrar objetos de AD y cosecha las recompensas de un gran rendimiento y eficiencia!

Lecturas adicionales

Source:
https://adamtheautomator.com/ldap-filter/