0

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

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

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

因此,在从数据库中获取用户之后,如果我调用:

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

我的“用户”返回为空。

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

任何帮助表示赞赏。

谢谢, 迪克沙

4

1 回答 1

1

混合AD和SQL应该没有问题。你唯一的耦合是List<string>. 如果字符串在一种情况下有效,而相同的字符串在另一种情况下无效,则它与您获取字符串的方式没有任何关系,但在环境或线程中有所不同,例如安全上下文或类似内容.

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

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

于 2012-02-15T03:07:43.013 回答