Pergunta

Eu preciso apenas o commonName dos grupos de um usuário é um membro do grupo.

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

então a propriedade memberOf contém um conjunto de cordas, os caminhos completos dos grupos. Isso é faz sentido, mas não é o que eu quero.

Eu tenho certeza que eu shoudn't novo um DirectoryEntry para cada um desses caminhos para obter o nome comum, mas é a melhor idéia para simplesmente analisar o cn do caminho? (Que parece bastante brutal)

Deve haver uma maneira melhor para obter um SearchResults de grupos de usuários é um membro do.

BTW, este é NET 2, então eu não posso fazer qualquer um dos LINQ fantasia para coisas AD nem tenho acesso aos novos bits em DirectoryServices para ActiveDirectory.

Foi útil?

Solução

O CN não é necessariamente igual ao nome do grupo. Analisá-lo fora do DN não é recomendável, uma vez que o DN escapou. Você precisaria consultar o diretório para os objetos.

Para recuperar um único objeto, defina a base de pesquisa para o seu nome distinto, o escopo da pesquisa para "base" e emitir a consulta.

cache os resultados da consulta em seu aplicativo para evitar emitir a mesma consulta LDAP mais de uma vez é aconselhável (no caso de você recuperar o memberOf de mais de um objeto em uma linha).

Exemplo de código ( direita fora do MSDN , apenas ligeiramente 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();

Outras dicas

Infelizmente não há nenhuma maneira melhor no .NET 2.0 do que o que você descreve. O atributo memberOf simplesmente contém os nomes distintos completos de todos os grupos o usuário é um membro de modo a melhor solução é para analisar cada nome distinto.

Encontrado esta discussão antiga na seção "relacionadas".

Got duas outras sugestões para esta pergunta.
Cada um deles pode obter objetos no atributo memberOf diretamente como SearchResult em uma busca.

Todo o código está em C #.

Atributo Âmbito da Consulta (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);
}

Limitações:

  • Não manuseie participação no grupo principal
  • Requer nível funcional de 2003 (esqueceu domínio / floresta)
  • ASQ não funcionam através de domínio (pelo menos System.DirectoryServices não pode, ele vai jogar exceção para qualquer objeto em outro domínio)

LDAP_MATCHING_RULE_IN_CHAIN ??regra de harmonização:

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);
}

Limitações:

  • Não manuseie participação no grupo principal
  • Requer nível funcional de 2008 R2 (esqueceu domínio / floresta)
  • -lo chegar a associação de grupo aninhado, não apenas um nível de memberOf
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top