如果存在与SQL相关的调用,则UserPrincipal.FindByIdentity返回null,否则返回正确的Principal对象

时间:2012-02-15 02:14:58

标签: .net active-directory sqlconnection userprincipal

我有这个奇怪的问题。我正在尝试创建一个服务,将数据库中的用户与Active Directory(AD)中的电子邮件组中的用户同步。因此,如果A,B,C在数据库中,并且活动目录电子邮件组具有A& E,我会同步AD。所以我将添加'E'并删除'B'和amp; 'C'。

要从数据库中获取用户,我执行SQL调用。之后,如果我尝试添加用户,我将UserPrincipal.FindByIdentity作为null。这是我提出的测试代码。

        int tries = 0;
        List<string> dbUsers = new List<string>();
        dbUsers.Add("12345");//test user id's
        dbUsers.Add("67891");

        int k = 0;
        for (k = 0; k < dbUsers.Count; k++)
        {
            AddUserToGroup(tries, dbUsers[k]);
        }

     public void AddUserToGroup(int tries, string userid)
     {
        try
        {
            PrincipalContext ctx = new PrincipalContext(ContextType.Domain,      domainName, Container, userName, Password);

            Principal user = Principal.FindByIdentity(ctx, userid); 
            string groupName = "TestGroup";

            using (ctx)
            {
                GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, groupName);
                if (!user.IsMemberOf(group))
                {
                    group.Members.Add(ctx, IdentityType.UserPrincipalName, user.UserPrincipalName);
                    group.Save();
                }
            }
        }
        catch (AppDomainUnloadedException ex)
        {
            if (tries > 5)
            {
                throw;
            }
            tries += 1;
            Thread.Sleep(1000);
            AddUserToGroup(tries, userid);
        }
    }

这件作品完美无缺,我正确地获得了'用户'对象,我可以成功将其添加到AD电子邮件组。问题是我有SQL调用从数据库获取userId而不是硬编码。

所以有问题的代码是:

      List<string> dbUsers = GetActiveMembersFromDB('id')
      public List<string> GetActiveMembersFromDB(string practiceGroupId)
      {
        List<string> outpt = new List<string>();
        string SQLstring = string.Empty;

        string SQL_CONNECTION_STRING = "connectionString"; 
        SQLstring = "SELECT * from dbo.test";//whatever query

        using (SqlConnection cn = new SqlConnection(SQL_CONNECTION_STRING))
        {
            cn.Open();
            try
            {
                SqlCommand cm = new SqlCommand(SQLstring, cn);

                using (SqlDataReader dr = cm.ExecuteReader())
                {
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            outpt.Add(dr["userId"].ToString());
                        }
                        return outpt;
                    }
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                if (cn != null)
                {
                    SqlConnection.ClearPool(cn);
                    cn.Close();
                }
            }
        }
        return outpt;
    }

所以在从DB获取用户后,如果我打电话:

        int k = 0;
        for (k = 0; k < dbUsers.Count; k++)
        {
            AddUserToGroup(tries, dbUsers[k]);
        }

我的'用户'将返回null。

是否有其他人遇到过同样的问题。 DB调用和AD调用一起出了什么问题。我的意思是,我关闭了我的数据库调用中的所有连接,然后尝试访问Active Directory(AD)。

感谢任何帮助。

谢谢, Deeksha

1 个答案:

答案 0 :(得分:1)

混合AD和SQL应该没有问题。你唯一的联系是List<string>。如果字符串在一种情况下工作而相同的字符串在另一种情况下不起作用,那么它应该与你如何获得字符串无关,而是在环境或线程上有所不同,例如安全上下文或类似的

我认为你需要将它提炼到显示问题的最小测试用例。

我注意到您的用户名和密码是在给定代码之外定义的 - 您检查过并确保没有覆盖它们吗?