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:
- tienes el módulo ActiveDirectory de PowerShell instalado
- estás en un equipo unido a un dominio
- puedes conectarte y autenticarte correctamente en un controlador de dominio AD
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:
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.
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.
Ambos devuelven lo siguiente:
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
:
- Base – El objeto que se ha especificado como el SearchBase.
- OneLevel – busca objetos contenidos inmediatamente por el SearchBase pero no en ningún subcontenedor.
- SubTree – busca objetos contenidos por el SearchBase y en cualquier subcontenedor, recursivamente a través de la jerarquía de AD.

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!