2012-02-15 13 views
0

私はこの奇妙な問題があります。私はActive Directory(AD)の電子メールグループ内のユーザーにデータベース内のユーザーを同期させるサービスを作成しようとしています。したがって、A、B、Cがデータベースにあり、アクティブディレクトリの電子メールグループがA & Eの場合、私はADを同期させます。だから私は 'E'を追加し、 'B'を削除します& 'C'。UserPrincipal.FindByIdentityは、SQLに関連するコールが存在する場合はnullを返し、それ以外の場合は正しいプリンシパルオブジェクトを返します。

データベースからユーザーを取得するには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電子メールグループに追加できます。問題は、ハードコーディングではなく、データベースから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]); 
     } 

私の 'ユーザーが' ヌルとして戻って来ています。

誰も同じ問題が発生しましたか? DB呼び出しとAD呼び出しの何が問題なのですか?つまり、dbコールのすべての接続を閉じてから、Active Directory(AD)にアクセスしようとします。

何か助けていただければ幸いです。

おかげで、 ディクシャ

答えて

1

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

私はあなたが問題を示す最小のテストケースに細分する必要があると思います。

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

+0

ありがとうございます。私は最小のケースにドリルダウンしようとし、DBからのユーザーIDが最後にスペースがあることがわかりました。 ありがとうございました。 –

関連する問題