Consultando a lista de endereços global (GAL) para usuários em vários domínios
-
12-09-2019 - |
Pergunta
Eu preciso procurar todos os usuários contendo uma cadeia de texto certo em seu nome contra a lista de endereços do Exchange Server global. Esta operação será realizada a partir de uma aplicação ASP.NET. Note que o GAL é necessário (não Active Directory), já que contém os usuários em vários domínios. É também o que o cliente solicitou.
Eu estive olhando para o Exchange Web Services e métodos Outlook Web Access. No entanto, nem pode ser configurado na minha organização, de modo que eu preciso saber qual opção é a correta antes de pedir a infra-estrutura para configurá-lo.
Exchange Web Services
Eu esperava usar o href="http://msdn.microsoft.com/en-us/library/aa563518.aspx" rel="nofollow noreferrer"> método no Exchange Web Services . A documentação para ele afirma que:
Active Directory é procurado em primeiro lugar, e, em seguida, pasta de contatos do usuário é pesquisada.
Parece implicar que este método só retornará usuários do domínio atual. É este correto?
Outlook Web Access
A outra opção que eu encontrei foi GALFind. Isso parece perfeito, mas este artigo afirmou que é não suportado . Confirma-se como nenhum disponível já neste artigo Technet .
Alguém por favor pode dar conselhos sobre estes ou quaisquer outras opções?
Solução
É possível consultar vários domínios, iniciando a consulta a partir da raiz da floresta. Aqui está o código que acabou usando:
string filter = "(&(objectCategory=person)(objectClass=user)(name=*" + search + "*))";
var rootEntry = new DirectoryEntry("GC:");
foreach (DirectoryEntry entry in rootEntry.Children)
{
DirectoryEntry forestEntry = entry;
DirectorySearcher searcher = new DirectorySearcher
{
SearchRoot = forestEntry,
Filter = filter,
Sort =
{
Direction = SortDirection.Ascending,
PropertyName = "cn"
}
};
searcher.PropertiesToLoad.AddRange(ADProperties.Values.ToArray());
SearchResultCollection results = searcher.FindAll();
foreach (SearchResult result in results)
{
DirectoryEntry foundEntry = result.GetDirectoryEntry();
// Do something
}
}
Outras dicas
Não sou especialista Exchange, mas você não pode fazer isso usando Collaboration Data Objects (CDO), embora possa não ser muito rápida .