existe active .net active-directory directoryservices

.net - active - system.directoryservices nuget



¿Dónde está el nombre de dominio en un objeto UserPrincipal? (2)

Para AD DS, el valor de msDS-PrincipalName es el nombre de dominio NetBIOS, seguido de una barra invertida ("/").

Puedes encontrarlo usando:

/* Retreiving the root domain attributes */ sFromWhere = "LDAP://DC_DNS_NAME:389/dc=dom,dc=fr"; DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "AdminLogin", "PWD"); DirectorySearcher dsLookForDomain = new DirectorySearcher(deBase); dsLookForDomain.Filter = "(objectClass=*)"; dsLookForDomain.SearchScope = SearchScope.base; dsLookForDomain.PropertiesToLoad.Add("msDS-PrincipalName"); SearchResult srcDomains = dsLookForDomain.FindOne();

Estoy usando las clases System.DirectoryServices.ActiveDirectory para encontrar todos los usuarios de Active Directory. El código es muy simple:

var context = new PrincipalContext(ContextType.Domain); var searcher = new PrincipalSearcher(new UserPrincipal(context)); var results = searcher.FindAll();

Deseo obtener el nombre de usuario calificado para el dominio en el formato "amigable" (también conocido como "pre-Windows 2000"), por ej. "CONTOSO / SmithJ". UserPrincipal.SamAccountName me da la parte del nombre de usuario, pero ¿cómo obtengo la parte del dominio? No puedo suponer que el dominio será el mismo que el de la máquina o el dominio actual del usuario.


OK, aquí está el código final que se me ocurrió usando la respuesta de JPBlanc y la respuesta vinculada por MichaelZ . Muestra el SID, el nombre para mostrar y el DOMINIO / nombre de usuario para cada usuario.

var ldapUrl = "LDAP://" + defaultNamingContext; using (var rootDe = new DirectoryEntry(ldapUrl)) using (var searcher = new DirectorySearcher(rootDe)) { searcher.SearchScope = SearchScope.Subtree; searcher.PropertiesToLoad.Add("objectSid"); searcher.PropertiesToLoad.Add("displayName"); searcher.PropertiesToLoad.Add("msDS-PrincipalName"); searcher.Filter = "(&(objectClass=user)(objectCategory=person))"; var results = searcher.FindAll(); foreach (SearchResult result in results) { var qualifiedUsername = GetSinglePropertyValue(result, "msDS-PrincipalName"); var displayName = GetSinglePropertyValue(result, "displayName"); var sid = new SecurityIdentifier((byte[])GetSinglePropertyValue(result,"objectSid"), 0); Console.WriteLine("User: {0}/r/n/tDisplay name: {1}/r/n/tSID: {2}", qualifiedUsername, displayName, sid); } } private static object GetSinglePropertyValue(SearchResult result, string propertyName) { var value = result.Properties[propertyName]; if (value.Count == 0) return null; if (value.Count == 1) return value[0]; throw new ApplicationException(string.Format("Property ''{0}'' has {1} values for {2}", propertyName, value.Count, result.Path)); }

Y para obtener el contexto de nombres predeterminado para el dominio de la máquina (como se responde aquí ):

private static string GetDefaultNamingContext() { // This check is fast try { Domain.GetComputerDomain(); } catch (ActiveDirectoryObjectNotFoundException) { return null; } // This takes 5 seconds if the computer is not on a domain using (var rootDe = new DirectoryEntry("LDAP://RootDSE")) { try { return (string)rootDe.Properties["defaultNamingContext"][0]; } catch (COMException ex) { if (ex.ErrorCode == -2147023541) return null; throw; } } }