none
Como faço para verificar os grupos do A.D. dentro de uma página do CRM 4.0? RRS feed

  • Pergunta

  • Ola a todos.

    Essa é a minha primeira pergunta no fórum, por isso caso já tenha alguma conversa sobre isso me avisem.

    Meu problema é o seguinte, preciso de dentro de um formulário do CRM. buscar os grupos do Active Directory  que o usuário logado na página faz parte.

    Minha idéia é embutir o javascript no onload da página [feito], fazer um request para um generic handler[feito] que verificaria pelo login do usuário do crm (pego pelo javascript) qual os grupos ele pertence e se ele faz parte de um especifico.

    Meu problema vem ao pesquisar o A.D.

    o código que eu uso é o seguinte:

     var Grupos = GetGroups(CorrigirUserName(username));
    
     Result = Grupos.Exists(g => g == "CN=GrupoProcurado");
    
    
    
     public List<string> GetGroups(string username)
        {
          List<string> grupos = new List<string>();
          try
          {
            DirectoryEntry oEntry = new DirectoryEntry("LDAP://RootDSE");
            oEntry.AuthenticationType = AuthenticationTypes.None;
            DirectorySearcher search = new DirectorySearcher(oEntry, "(sAMAccountName=" + username + ")");
            var resultado = search.FindOne();
    
    
            if (null != resultado)
            {
              DirectoryEntry oUser = new DirectoryEntry(resultado.Path);
              oUser.AuthenticationType = AuthenticationTypes.None;
    
              object oGrupos = oUser.Invoke("Groups");
              foreach (object ob in (System.Collections.IEnumerable)oGrupos)
              {
                DirectoryEntry obGpEntry = new DirectoryEntry(ob);
                obGpEntry.AuthenticationType = AuthenticationTypes.None;
                grupos.Add(obGpEntry.Name);
              }
            }
          }
          catch (Exception ex)
          {
            Log.Add(ex, true);
            throw ex;
          }
          return grupos;
        }
    

     

    Então, na minha máquina, ele funciona, acha os grupos e verifica se existe de forma correta.

     

    Quando eu faço no servidor do CRM, colocando meu GenericHandler dentro ISV, ele simplesmente não funciona mais, me trazendo o erro:

     

    Erro ocorrido em: 15/04/2011 05:00:34:034 Mensagem de erro:Unknown error (0x80005000)
    
    Stack:   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
    
       at System.DirectoryServices.DirectoryEntry.Bind()
    
       at System.DirectoryServices.DirectoryEntry.get_AdsObject()
    
       at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
    
       at System.DirectoryServices.DirectorySearcher.FindOne()
    
       at CRM.Compugraf.WebResources.Userhandler.GetGroups(String username) FIM Erro
    
     
    

     

    Em resumo, se alguem sabe o que fazer, fez algo parecido e pode me ajudar, peço sua ajuda.

     

     

    Evandro.


     

    sexta-feira, 15 de abril de 2011 21:40

Respostas

  •  

    Bem Tiago, pode até ser, mas achei finalmente uma solução para meu problema, parei de usar os DirectoryEntry

    Um dos meus companheiros de empresa me deu uma solução melhor que a que eu tentei.

    Meu código ficou assim:

     

    using System.DirectoryServices.AccountManagement;
    
    public MyClass
    {
    
      public bool GetResult(string username)
        {
          try
          {
            PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,null,"Dominio");
            UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, username);
            PrincipalSearchResult<Principal> results = userPrincipal.GetGroups(domainContext);
    
            foreach (var group in results)
              if (group.Name == "GrupoQueEuQuero")
                return true;
          }
          catch (Exception ex)
          {
            throw ex;
          }
    
          return false;
        }
    }
    

    Assim consigo listar os grupos desse username e verificar a existência de um certo grupo.

     

    Obrigado Tiago pela resposta.

     

     

    Att. Evandro

     

    • Marcado como Resposta E.Capelari segunda-feira, 18 de abril de 2011 16:27
    segunda-feira, 18 de abril de 2011 16:27

Todas as Respostas

  • Creio que seja problema no registro das dll's que está utilizando, pode incluí-las no "bin" do CRM ou registrá-las no GAC.

     

    Att,

    Tiago Cardoso

    segunda-feira, 18 de abril de 2011 13:45
    Moderador
  •  

    Bem Tiago, pode até ser, mas achei finalmente uma solução para meu problema, parei de usar os DirectoryEntry

    Um dos meus companheiros de empresa me deu uma solução melhor que a que eu tentei.

    Meu código ficou assim:

     

    using System.DirectoryServices.AccountManagement;
    
    public MyClass
    {
    
      public bool GetResult(string username)
        {
          try
          {
            PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,null,"Dominio");
            UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, username);
            PrincipalSearchResult<Principal> results = userPrincipal.GetGroups(domainContext);
    
            foreach (var group in results)
              if (group.Name == "GrupoQueEuQuero")
                return true;
          }
          catch (Exception ex)
          {
            throw ex;
          }
    
          return false;
        }
    }
    

    Assim consigo listar os grupos desse username e verificar a existência de um certo grupo.

     

    Obrigado Tiago pela resposta.

     

     

    Att. Evandro

     

    • Marcado como Resposta E.Capelari segunda-feira, 18 de abril de 2011 16:27
    segunda-feira, 18 de abril de 2011 16:27