usuarios usuario servidor query funcional crear consultar conectar con active c# active-directory ldap active-directory-group

usuario - principalcontext c# active directory



Listado de todos los grupos de Active Directory (4)

El siguiente código enumera algunos, pero no todos, los Grupos de Active Directory. ¿Por qué?

Estoy intentando enumerar todos los grupos de seguridad, grupos de distribución, grupos de computadoras, etc. ¿He especificado la objectClass incorrecta?

private static void ListGroups() { DirectoryEntry objADAM = default(DirectoryEntry); DirectoryEntry objGroupEntry = default(DirectoryEntry); DirectorySearcher objSearchADAM = default(DirectorySearcher); SearchResultCollection objSearchResults = default(SearchResultCollection); SearchResult myResult=null; objADAM = new DirectoryEntry(LDAP); objADAM.RefreshCache(); objSearchADAM = new DirectorySearcher(objADAM); objSearchADAM.Filter = "(&(objectClass=group))"; objSearchADAM.SearchScope = SearchScope.Subtree; objSearchResults = objSearchADAM.FindAll(); // Enumerate groups try { fileGroups.AutoFlush = true; if (objSearchResults.Count != 0) { foreach (SearchResult objResult in objSearchResults) { myResult = objResult; objGroupEntry = objResult.GetDirectoryEntry(); Console.WriteLine(objGroupEntry.Name); fileGroups.WriteLine(objGroupEntry.Name.Substring(3)); } } else { throw new Exception("No groups found"); } } catch (PrincipalException e) { fileErrorLog.AutoFlush = true; fileErrorLog.WriteLine(e.Message + " " + myResult.Path); } catch (Exception e) { throw new Exception(e.Message); } }


Probé esto y funcionó

public ArrayList GetAllGroupNames(string ipAddress, string ouPath) { DirectorySearcher deSearch = new DirectorySearcher(); deSearch.SearchRoot = GetRootDirectoryEntry(ipAddress, ouPath); deSearch.Filter = "(&(objectClass=group))"; SearchResultCollection results = deSearch.FindAll(); if (results.Count > 0) { ArrayList groupNames = new ArrayList(); foreach (SearchResult group in results) { var entry = new DirectoryEntry(group.Path, UserName, Password); string shortName = entry.Name.Substring(3, entry.Name.Length - 3); groupNames.Add(shortName); } return groupNames; } else { return new ArrayList(); } } private DirectoryEntry GetRootDirectoryEntry(string ipAddress, string domainPath, string username, string password) { var ldapPath = "LDAP://" + ipAddress + "/" + domainPath; return new DirectoryEntry(ldapPath, username, password, AuthenticationTypes.Secure); }


Probar el filtro "(objectcategory = group)" Solución encontrada here


Si está en .NET 3.5 o más reciente, puede usar un PrincipalSearcher y un principal de "consulta por ejemplo" para realizar su búsqueda:

// create your domain context PrincipalContext ctx = new PrincipalContext(ContextType.Domain); // define a "query-by-example" principal - here, we search for a GroupPrincipal GroupPrincipal qbeGroup = new GroupPrincipal(ctx); // create your principal searcher passing in the QBE principal PrincipalSearcher srch = new PrincipalSearcher(qbeGroup); // find all matches foreach(var found in srch.FindAll()) { // do whatever here - "found" is of type "Principal" - it could be user, group, computer..... }

Si aún no lo ha hecho, lea completamente el artículo de MSDN Cómo administrar los principios de seguridad de directorios en .NET Framework 3.5, que muestra muy bien cómo hacer el mejor uso de las nuevas funciones en System.DirectoryServices.AccountManagement


DirectoryEntry entry = new DirectoryEntry("ldap://ldap.gaurangjadia.com", "scott", "tiger"); DirectorySearcher dSearch = new DirectorySearcher(entry); dSearch.Filter = "(&(objectClass=group))"; dSearch.SearchScope = SearchScope.Subtree; SearchResultCollection results = dSearch.FindAll(); for (int i = 0; i < results.Count; i++) { DirectoryEntry de = results[i].GetDirectoryEntry(); //TODO with "de" }