Pregunta

Necesito solo el nombre común de los grupos de los que es miembro un usuario.

DirectoryEntry user = new DirectoryEntry("LDAP://cn=myuser....");
foreach(string path in user.Properties["memberOf"])
    Console.WriteLine(path);

entonces la propiedad memberOf contiene un conjunto de cadenas, las rutas completas de los grupos. Eso tiene sentido, pero no es lo que quiero.

Estoy bastante seguro de que no debo actualizar un DirectoryEntry para cada una de esas rutas para obtener el nombre común, pero ¿es la mejor idea simplemente analizar el cn desde la ruta? (eso parece bastante brutal)

Debe haber una mejor manera de obtener un SearchResults de grupos de los que un usuario es miembro.

Por cierto, esto es .NET 2, así que no puedo hacer ninguna de las cosas elegantes de LINQ to AD ni tengo acceso a los nuevos bits en DirectoryServices para ActiveDirectory.

¿Fue útil?

Solución

El CN no es necesariamente igual al nombre del grupo. No es recomendable analizarlo fuera del DN, ya que se escapa el DN. Debería consultar el directorio para los objetos.

Para recuperar un solo objeto, establezca la base de búsqueda en su nombre distinguido, el ámbito de búsqueda en "base". y emitir la consulta.

Es recomendable almacenar en caché los resultados de la consulta en su aplicación para evitar emitir la misma consulta LDAP más de una vez (en caso de que recupere el memberOf de más de un objeto en una fila).

Código de muestra ( justo fuera del MSDN , solo ligeramente modificado ):

string dn = "LDAP://CN=Group Name,ON=Groups,DC=fabrikam,DC=com";

// Bind to a specific group.
DirectoryEntry entry = new DirectoryEntry(dn);

// Create a DirectorySearcher object.
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.SearchScope = SearchScope.Base;
mySearcher.PropertiesToLoad.Add("displayName"); 

// Use the FindOne method to find the group object.
SearchResult resEnt = mySearcher.FindOne();

Otros consejos

Desafortunadamente, no hay mejor manera en .NET 2.0 que la que usted describe. El atributo memberOf simplemente contiene los nombres completos de todos los grupos a los que pertenece el usuario, por lo que su mejor solución es analizar cada nombre distinguido.

Encontré este hilo antiguo en el " Relacionado " sección.

Tengo otras dos sugerencias para esta pregunta.
Cada uno de ellos puede obtener objetos en el atributo memberOf directamente como SearchResult en una búsqueda.

Todo el código está en C #.

Consulta de alcance de atributo (ASQ):

DirectoryEntry userEntry = new DirectoryEntry("LDAP://<server>/<user DN>", "user", "pwd");

DirectorySearcher searcher = new DirectorySearcher(userEntry);
searcher.SearchScope = SearchScope.Base;
searcher.AttributeScopeQuery = "memberOf";
searcher.PropertiesToLoad.Clear();
// just load any attributes you want, not limited to cn
searcher.PropertiesToLoad.Add("cn");

foreach (SearchResult result in searcher.FindAll())
{
    Console.WriteLine(result.Path);
}

Limitaciones:

  • No maneje la membresía del grupo primario
  • Requiere nivel funcional de 2003 (olvidé el dominio / bosque)
  • ASQ no funciona en todos los dominios (al menos System.DirectoryServices no puede, arrojará una excepción para cualquier objeto en otro dominio)

Regla de coincidencia LDAP_MATCHING_RULE_IN_CHAIN:

DirectoryEntry rootEntry = new DirectoryEntry("GC://<GC server>", "user", "pwd");

DirectorySearcher searcher = new DirectorySearcher(rootEntry);
searcher.SearchScope = SearchScope.Subtree;
searcher.Filter = "(member:1.2.840.113556.1.4.1941:=<user DN>)";
searcher.PropertiesToLoad.Clear();
// just load any attributes you want, not limited to cn
searcher.PropertiesToLoad.Add("cn");

foreach (SearchResult result in searcher.FindAll())
{
    Console.WriteLine(result.Path);
}

Limitaciones:

  • No maneje la membresía del grupo primario
  • Requiere un nivel funcional de 2008 R2 (olvidé el dominio / bosque)
  • obtiene membresía de grupo anidada, no solo un nivel de memberOf
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top