ejemplos c# active-directory directory ldap directoryservices

directorysearcher c# ejemplos



Buscar Active Directory para una unidad organizativa utilizando una ruta parcial a la unidad organizativa (1)

¿Hay alguna forma en la sintaxis de AD Query para encontrar la ruta completa de una OU buscando en su ruta parcial?

Por ejemplo, la ruta completa a mi unidad organizativa es:

OU=Clerks,OU=OfficeA,OU=Administration,DC=domain,DC=local

Ahora, me gustaría intentar buscar y encontrar ese objeto usando la ruta parcial:

OU=Clerks,OU=OfficeA

Me gustaría poder buscar algo como:

(&(objectCategory=organizationalUnit)(path=Clerks/OfficeA*))

No puedo encontrar ningún ejemplo de sintaxis sobre cómo lograr algo como esto. Un programa que estoy desarrollando requiere que obtenga las rutas a muchas unidades organizativas que tienen una estructura común en los dos últimos niveles de OU, sin embargo, pueden anidarse en cualquier profundidad dada en el dominio de lo contrario. Si puedo buscar de alguna manera como este, sería fácil obtener la ruta completa simplemente buscando en los dos últimos niveles anidados OU.


Lo que desea hacer existe en la implementación de LDAP pura es una característica llamada ExtensibleMatch que parece explicarse correctamente en este artículo de wiki . También encontrarás ejemplos útiles aquí .

Pero no está presente en Active-Directory

Así que aquí hay un método escrito en C # que explota las propiedades de los Parent de un DirectoryEntry .

static List<DirectoryEntry> OuInTheFormOf(DirectoryEntry deBase, string ou1, string ou2) { List<DirectoryEntry> deList = null; /* Directory Search */ DirectorySearcher dsLookFor = new DirectorySearcher(deBase); dsLookFor.Filter = ou1; dsLookFor.SearchScope = SearchScope.Subtree; dsLookFor.PropertiesToLoad.Add("ou"); SearchResultCollection srcOUs = dsLookFor.FindAll(); if (srcOUs.Count != 0) { deList = new List<DirectoryEntry>(); foreach (SearchResult srOU in srcOUs) { DirectoryEntry deOU = srOU.GetDirectoryEntry(); if (deOU.Parent.Name.ToUpper() == ou2.ToUpper()) deList.Add(deOU); } } return deList; }

Aquí está el uso:

/* Connection to Active Directory */ DirectoryEntry deBase = new DirectoryEntry("LDAP://WM2008R2ENT:389/dc=dom,dc=fr"); List<DirectoryEntry> l = OuInTheFormOf(deBase, "ou=Clerks", "ou=OfficeA"); foreach (DirectoryEntry deTmp in l) { Console.WriteLine(deTmp.Properties["distinguishedName"].Value); }