我有这个奇怪的问题。我正在尝试创建一项服务,将数据库中的用户与 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);
}
}
这件作品完美无缺,我正确获取了“用户”对象,并且可以成功地将其添加到 AD 电子邮件组。问题是当我有 SQL 调用从数据库中获取 userId 而不是硬编码时。
所以有问题的代码是:
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]);
}
我的“用户”返回为空。
有没有其他人遇到过同样的问题。DB调用和AD调用有什么问题。我的意思是,我关闭了我的数据库调用中的所有连接,然后尝试访问 Active Directory(AD)。
任何帮助表示赞赏。
谢谢, 迪克沙