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