0

私はこの奇妙な問題を抱えています。データベース内のユーザーをActiveDirectory(AD)の電子メールグループ内のユーザーに同期するサービスを作成しようとしています。したがって、A、B、Cがデータベースにあり、Active Directoryの電子メールグループにAとEがある場合、ADを同期します。そこで、「E」を追加し、「B」と「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);
        }
    }

この部分は完全に機能し、「user」オブジェクトを正しく取得して、AD電子メールグループに正常に追加できます。問題は、ハードコーディングの代わりにデータベースからuserIdを取得する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;
    }

したがって、DBからユーザーをフェッチした後、次のように呼び出します。

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

私の「ユーザー」はnullとして戻ってきます。

他の誰かが同じ問題に遭遇しましたか。DB呼び出しとAD呼び出しを一緒にした場合の何が問題になっていますか。つまり、db呼び出しのすべての接続を閉じてから、Active Directory(AD)にアクセスしようとします。

どんな助けでも大歓迎です。

ありがとう、ディークシャ

4

1 に答える 1

1

AD と SQL を混在させても問題はありません。あなたの唯一のカップリングはList<string>. 文字列があるケースでは機能し、同じ文字列が別のケースでは機能しない場合、文字列を取得した方法とは何の関係もないはずですが、セキュリティ コンテキストなどのように、環境またはスレッドで何かが異なります。 .

問題を示す最小のテストケースにそれを抽出する必要があると思います。

あなたのユーザー名とパスワードは指定されたコードの外で定義されていることに気付きました - それらを上書きしていないことを確認しましたか?

于 2012-02-15T03:07:43.013 に答える