Buscar Informações do AD para Web Parts, sem utilizar SSP

Boa Tarde SharePointers,
 
Neste post vou demonstrar como podemos nos conectar em um Active Directory e buscar todos os usuários e suas propriedades.
Recurso muito usado para montar web parts com estas informações em desenvolvimentos SharePoint com instalação WSS, pois com a versão MOSS você tem disponível as configurações de propriedades mapeadas por usuários no SSP(Shared Services Provider).
 
Abaixo demonstro uma classe que busca os usuários do domínio "administrativo":
 

        public List<Usuario> GetUsers()
        {
            List<Usuario> lUsuarios = new List<Usuario>();

            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                //Nome do grupo de usuários que estamos procurando no AD, geralmente devemos buscar um grupo específico
                //então já deixei este parâmetro aqui para facilitar
                string GroupName = "windowsSharepoint";

                //Nome do domínio a ser procurado
                string domain = "administrativo";

                //Propriedade de Indexação, default para todos os ADs
                string[] properties = new string[] { "fullname" };

                //Forma de conexão, via LDAP
                DirectoryEntry adRoot = new DirectoryEntry("LDAP://" + domain, null, null, AuthenticationTypes.Secure);
                DirectorySearcher searcher = new DirectorySearcher(adRoot);
                searcher.SearchScope = SearchScope.Subtree;
                searcher.ReferralChasing = ReferralChasingOption.All;
                searcher.PropertiesToLoad.AddRange(properties);

                //Filtro utilizando o grupo definido acima, se não for necessário utilizar um filtro é só comentar esta linha
                searcher.Filter = "(&(objectClass=group)(cn=" + GroupName + "))";
                SearchResult result = searcher.FindOne();

                if (result != null)
                {
                    DirectoryEntry deGroup = new DirectoryEntry(result.Path, null, null, AuthenticationTypes.Secure);
                   
                    //Criando a sua property collection, com todas as propriedades retornadas
                    System.DirectoryServices.PropertyCollection pcoll = deGroup.Properties;
                    int n = pcoll["member"].Count;

                    //Se existir usuários encontrados na busca, executamos um laço que irá adicionalos em uma nova lista.
                    for (int l = 0; l < n; l++)
                    {
                        //Criando o link de acesso para um usuário específico do AD, para buscar as propriedades específicas
                        DirectoryEntry deUser = new DirectoryEntry("LDAP://" + domain + "/" + pcoll["member"][l].ToString(), null, null, AuthenticationTypes.Secure);

                        //Validação para verificar se o usuário está desabilitado
                        //Pode variar de AD para AD, porem este é o padrão
                        if (deUser.Properties["userAccountControl"][0].ToString() != "514")
                        {
                            //Objeto Usuário criado para armazenar as propriedades
                            Usuario oUsuario = new Usuario();

                            //Utiliza-se o try e catch pois as propriedades podem não estar acessiveis ou não serem encontradas em determinado AD
                            //Com isto buscamos apenas as propriedades que forem encontradas e que estejam preenchidas
                            try
                            {
                                if (deUser.Properties["displayName"] != null && deUser.Properties["displayName"][0] != null)
                                    oUsuario.Nome = deUser.Properties["displayName"][0].ToString();
                            }
                            catch { }
                            try
                            {
                                if (deUser.Properties["mail"] != null && deUser.Properties["mail"][0] != null)
                                    oUsuario.Email = deUser.Properties["mail"][0].ToString();
                            }
                            catch { }
                            try
                            {
                                if (deUser.Properties["telephoneNumber"] != null && deUser.Properties["telephoneNumber"][0] != null)
                                    oUsuario.Ramal = deUser.Properties["telephoneNumber"][0].ToString();
                            }
                            catch { }
                            try
                            {
                                if (deUser.Properties["department"] != null && deUser.Properties["department"][0] != null)
                                    oUsuario.Departamento = deUser.Properties["department"][0].ToString();
                            }
                            catch { }

                            //Adicionando o usuário com as propriedades preenchidas na nossa listagem
                            lUsuarios.Add(oUsuario);
                        }
                        //Fechando o objeto de entrada no diretório do usuário
                        deUser.Close();
                    }
                    //Fechando o objeto de entrada no diretório dos grupos
                    deGroup.Close();
                }
            });

            //Retornando a Lista Preenchida
            return lUsuarios;
        }

 

Para que este código funcione você terá que criar o objeto Usuário, segue a estrutura da classe abaixo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Demonstracao.Intranet.WebParts
{
    public class Usuario
    {
        #region Variaveis
        private string _Nome;
        private string _Ramal;
        private string _Departamento;
        private string _Email;
        #endregion
        #region Propriedades
        public string Nome
        {
            get { return _Nome; }
            set { _Nome = value; }
        }

        public string Ramal
        {
            get { return _Ramal; }
            set { _Ramal = value; }
        }

        public string Departamento
        {
            get { return _Departamento; }
            set { _Departamento = value; }
        }

        public string Email
        {
            get { return _Email; }
            set { _Email = value; }
        }
        #endregion
    }
}

Pronto, com isto temos a nossa busca no Active Directory sendo executada e uma lista dos usuários(com algumas propriedades mais utilizadas) de um grupo específico em uma List, podendo ser trabalhada da melhor forma.

Segue uma lista completa dos atributos de um Active Directory, mas sempre é bom verificar com o administrador de rede qual as propriedades que contem as informações que você precisa para sua solução:

http://msdn.microsoft.com/en-us/library/ms675090(v=VS.85).aspx

 

Abs e até a próxima.

Esta entrada foi publicada em Desenvolvimento Sharepoint. Adicione o link permanente aos seus favoritos.

Uma resposta para Buscar Informações do AD para Web Parts, sem utilizar SSP

  1. Charles Lomboni disse:

    Muito bom cara! Obrigado por compartilhar, me ajudou bastante. ;)

    []‘s

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s