2012-02-15 59 views
0

我有這個奇怪的問題。我正在嘗試創建一個服務,將數據庫中的用戶同步到Active Directory(AD)中的電子郵件組中的用戶。因此,如果A,B,C在數據庫中並且活動目錄電子郵件組具有A,那麼我將同步AD。所以我會加'E'並刪除'B'&'C'。如果存在SQL相關的調用,UserPrincipal.FindByIdentity返回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); 
     } 
    } 

這片完美的作品,我得到正確的「用戶」對象,我可以成功地加入到AD電子郵件組。問題是當我使用SQL調用從數據庫獲取userId而不是硬編碼時。

所以這是有問題的代碼是:

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

我的「用戶」是回來爲空:

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

從數據庫獲取用戶,如果我叫所以以後。

其他人遇到同樣的問題。數據庫調用和AD調用一起出現什麼問題?我的意思是,我關閉了數據庫調用中的所有連接,然後嘗試訪問Active Directory(AD)。

任何幫助表示讚賞。

感謝, Deeksha

回答

1

應該沒有問題的混合AD和SQL。你唯一的偶合是List<string>。如果字符串在一種情況下工作,並且相同的字符串在另一種情況下不起作用,那麼它應該與您獲得字符串的方式沒有任何關係,但是在環境或線程中會有所不同,例如安全上下文或類似。

我認爲你需要將其提取到最小的測試案例,它顯示了問題。

我注意到你的用戶名和密碼是在給出的代碼之外定義的 - 你有沒有檢查並確保你沒有覆蓋它們?

+0

謝謝凱德。我試圖鑽到最小的案例,發現DB中的用戶標識最後有一個空格。 再次感謝。 – 2012-02-28 22:44:02

相關問題