2012-02-15 2 views
0

이 이상한 문제가 있습니다. Active Directory (AD)의 전자 메일 그룹에있는 사용자에게 데이터베이스의 사용자를 동기화하는 서비스를 만들려고합니다. 따라서 A, B, C가 데이터베이스에 있고 활성 디렉토리 이메일 그룹에 A & E가 있으면 광고를 동기화합니다. 그래서 'E'를 추가하고 'B'를 제거합니다 & 'C'.UserPrincipal.FindByIdentity는 SQL 관련 호출이 있으면 null을 반환하고 그렇지 않으면 올바른 Principal 객체를 반환합니다.

데이터베이스에서 사용자를 얻으려면 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); 
     } 
    } 

이 작품은 완벽하게 작동하며 '사용자'개체가 올바르게 표시되며 광고 이메일 그룹에 추가 할 수 있습니다. 문제는 내가 하드 코딩 대신 데이터베이스에서 userId를 가져 오기 위해 SQL 호출을 할 때입니다.

그래서 문제가되는 코드는 다음과 같습니다

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

내 '사용자는'널 (null)로 돌아오고있다 :

 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에서 사용자를 가져 오는 후.

다른 누구도 동일한 문제가 발생했습니다. DB 호출과 AD 호출이 함께 잘못되었습니다. 내 db 호출의 모든 연결을 닫은 다음 Active Directory (AD)에 액세스하려고합니다.

도움을 주시면 감사하겠습니다.

덕분에, Deeksha는

답변

1

아무 문제 혼합 AD와 SQL이 없어야합니다. 유일한 커플 링은 List<string>입니다. 문자열이 하나의 케이스에서 작동하고 동일한 문자열이 다른 문자열에서 작동하지 않으면 문자열을 얻는 방법과 관련이 없어야합니다. 그러나 환경이나 스레드에서 보안 컨텍스트 또는 이와 유사한 다른 것이 있으면 안됩니다 .

문제가있는 가장 작은 테스트 케이스로 추출해야한다고 생각합니다.

사용자 이름과 비밀번호가 주어진 코드 외부에서 정의되어 있음을 확인했습니다. 사용자가 겹쳐 쓰지 않았는지 확인하고 확인 했습니까?

+0

감사합니다. 나는 가장 작은 경우까지 드릴 다운을 시도하고 DB에서 사용자 ID가 끝에 공간이 있음을 발견했습니다. 다시 한번 감사드립니다. –

관련 문제