usuarios usuario tipos programas predeterminados permisos para locales instalar grupos dominio delegar dar con administrador active active-directory ldap ldap-query

active-directory - tipos - usuario en dominio con permisos para instalar programas



¿Puedo unir un usuario a un grupo en diferentes dominios? (1)

Intento escribir una consulta LDAP que descubrirá si un usuario es miembro de un grupo que coincide con una consulta de comodín y estoy tratando de usar el OID LDAP_MATCHING_RULE_IN_CHAIN ​​para hacerlo. Básicamente estoy siguiendo el ejemplo 2 en esta página:

http://support.microsoft.com/kb/914828

Descubrí que este método funciona bien dentro de un dominio, es decir, si el usuario1 está en el grupo1 y el grupo1 en el grupo2, entonces puedo escribir una consulta que coincida con "* 2" y la consulta LDAP encontrará la relación anidada y el usuario contra el grupo .

Sin embargo, ahora me han pedido que apoye las relaciones entre dominios en el mismo bosque. Entonces ahora tengo:

  • user1 es un miembro de group1 en el dominio 1
  • group1 en el dominio 1 es miembro de group2 en el dominio 2

Y quiero poder hacer coincidir user1 contra group2 ... No puedo resolver cómo hacer que LDAP_MATCHING_RULE_IN_CHAIN ​​haga esto:

Intenté establecer la base de la consulta a lo siguiente:

  1. Dominio 1, pero esto solo devuelve grupos en el dominio 1
  2. El dominio principal del dominio 1 y el dominio 2, pero esto no arroja resultados.
  3. El GC, encontrado al consultar la propiedad "rootDSE", pero esto solo devuelve grupos dentro del dominio 1 (que es el servidor de GC)

¿Alguien sabe cómo puedo hacer que esto funcione?


Por lo que yo entiendo, una forma de hacerlo es:

  1. Desde RootDSE, busque la configuración NamingContext.
  2. En la configuración NamingContext busca objetos de la clase crossRef con un atributo nETBIOSName existente.
  3. A partir de estas entradas, use el algoritmo que está describiendo utilizando los dnsRoot y nCName . Un DNS forestal en funcionamiento le permite unirse a un controlador de dominio de dnsRoot . nCName permite buscar desde la raíz.

Tenga cuidado de hacer esto como miembro del grupo de administradores de la empresa.

Aquí hay un ejemplo del código.

/* Retreiving RootDSE */ string ldapBase = "LDAP://WM2008R2ENT:389/"; string sFromWhere = ldapBase + "rootDSE"; DirectoryEntry root = new DirectoryEntry(sFromWhere, "dom//jpb", "PWD"); string configurationNamingContext = root.Properties["configurationNamingContext"][0].ToString(); /* Retreiving the root of all the domains */ sFromWhere = ldapBase + configurationNamingContext; DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "dom//jpb", "PWD"); DirectorySearcher dsLookForDomain = new DirectorySearcher(deBase); dsLookForDomain.Filter = "(&(objectClass=crossRef)(nETBIOSName=*))"; dsLookForDomain.SearchScope = SearchScope.Subtree; dsLookForDomain.PropertiesToLoad.Add("nCName"); dsLookForDomain.PropertiesToLoad.Add("dnsRoot"); SearchResultCollection srcDomains = dsLookForDomain.FindAll(); foreach (SearchResult aSRDomain in srcDomains) { /* For each root look for the groups containing my user */ string nCName = aSRDomain.Properties["nCName"][0].ToString(); string dnsRoot = aSRDomain.Properties["dnsRoot"][0].ToString(); /* To find all the groups that "user1" is a member of : * Set the base to the groups container DN; for example root DN (dc=dom,dc=fr) * Set the scope to subtree * Use the following filter : * (member:1.2.840.113556.1.4.1941:=cn=user1,cn=users,DC=x) */ /* Connection to Active Directory */ sFromWhere = "LDAP://" + dnsRoot + "/" + nCName; deBase = new DirectoryEntry(sFromWhere, "dom//jpb", "PWD"); DirectorySearcher dsLookFor = new DirectorySearcher(deBase); // you cancomplete the filter here (&(member:1.2.840.113556.1.4.1941:=CN=user1 Users,OU=MonOu,DC=dom,DC=fr)(cn=*2) dsLookFor.Filter = "(member:1.2.840.113556.1.4.1941:=CN=user1 Users,OU=MonOu,DC=dom,DC=fr)"; dsLookFor.SearchScope = SearchScope.Subtree; dsLookFor.PropertiesToLoad.Add("cn"); SearchResultCollection srcGroups = dsLookFor.FindAll(); foreach (SearchResult srcGroup in srcGroups) { Console.WriteLine("{0}", srcGroup.Path); } }

Esto es solo una prueba de concepto, debes completar con:

utilizando el formulario using(){} para eliminar objetos DirectoryEntry

Gestión de excepciones

Editado (2011-10-18 13:25)

Su comentario sobre la forma de resolver el problema se puede encontrar en un método dado en System.DirectoryServices.AccountManagement Namespace . Es una especie de solución recursiva. Esta vez, pruebo con un usuario que pertenece al grupo1 (en otro dominio) que pertenece al grupo2 (en un tercer dominio) y parece funcionar.

/* Retreiving a principal context */ Console.WriteLine("Retreiving a principal context"); PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "WM2008R2ENT:389", "dc=dom,dc=fr", "jpb", "PWD"); /* Look for all the groups a user belongs to */ UserPrincipal aUser = UserPrincipal.FindByIdentity(domainContext, "user1"); PrincipalSearchResult<Principal> a = aUser.GetAuthorizationGroups(); foreach (GroupPrincipal gTmp in a) { Console.WriteLine(gTmp.Name); }