UserPrincipal.FindByIdentity возвращает значение NULL, если присутствуют вызовы, связанные с SQL, в противном случае он возвращает правильный объект Principal. - PullRequest
0 голосов
/ 15 февраля 2012

У меня странная проблема. Я пытаюсь создать службу, которая синхронизирует пользователей в базе данных с пользователями в группах электронной почты в 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);
        }
    }

Эта часть отлично работает, и я правильно получаю объект 'user', и я могу успешно добавить его в группу электронной почты AD. Проблема в том, что у меня есть вызов SQL для получения идентификатора пользователя из базы данных вместо жесткого кодирования.

Итак, проблемный код:

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

Мой «пользователь» возвращается как ноль.

Кто-нибудь еще сталкивался с такой же проблемой? Что не так с вызовами БД и AD звонками вместе. Я имею в виду, я закрываю все соединения в моих вызовах базы данных, а затем пытаюсь получить доступ к Active Directory (AD).

Любая помощь приветствуется.

Спасибо, Deeksha

1 Ответ

1 голос
/ 15 февраля 2012

Не должно быть проблем при смешивании AD и SQL. Ваша единственная связь - List<string>. Если строки работают в одном случае, а одна и та же строка не работает в другом, это не должно иметь ничего общего с тем, как вы получили строки, а должно быть чем-то другим в среде или в потоке, например, в контексте безопасности или подобном .

Я думаю, вам нужно отогнать его до самого маленького контрольного примера, который показывает проблему.

Я заметил, что ваше имя пользователя и пароль определены за пределами указанного кода - вы проверили и убедились, что не перезаписываете их?

...