У меня странная проблема. Я пытаюсь создать службу, которая синхронизирует пользователей в базе данных с пользователями в группах электронной почты в Active Directory (AD). Поэтому, если A, B, C находятся в базе данных, а в группе адресов электронной почты активного каталога есть A & E, я синхронизирую AD. Поэтому я добавлю «E» и удалю «B» и «C».
Чтобы получить пользователей из базы данных, я выполняю вызовы SQL. И после этого, если я пытаюсь добавить пользователя, я получаю UserPrincipal.FindByIdentity как ноль. Вот тестовый код, который я поставил.
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. Проблема в том, что у меня есть вызов 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;
}
Так что после извлечения пользователей из БД, если я позвоню:
int k = 0;
for (k = 0; k < dbUsers.Count; k++)
{
AddUserToGroup(tries, dbUsers[k]);
}
Мой «пользователь» возвращается как ноль.
Кто-нибудь еще сталкивался с такой же проблемой? Что не так с вызовами БД и AD звонками вместе. Я имею в виду, я закрываю все соединения в моих вызовах базы данных, а затем пытаюсь получить доступ к Active Directory (AD).
Любая помощь приветствуется.
Спасибо,
Deeksha