私はこの奇妙な問題を抱えています。データベース内のユーザーをActiveDirectory(AD)の電子メールグループ内のユーザーに同期するサービスを作成しようとしています。したがって、A、B、Cがデータベースにあり、Active Directoryの電子メールグループにAとEがある場合、ADを同期します。そこで、「E」を追加し、「B」と「C」を削除します。
データベースからユーザーを取得するために、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);
}
}
この部分は完全に機能し、「user」オブジェクトを正しく取得して、AD電子メールグループに正常に追加できます。問題は、ハードコーディングの代わりにデータベースからuserIdを取得する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;
}
したがって、DBからユーザーをフェッチした後、次のように呼び出します。
int k = 0;
for (k = 0; k < dbUsers.Count; k++)
{
AddUserToGroup(tries, dbUsers[k]);
}
私の「ユーザー」はnullとして戻ってきます。
他の誰かが同じ問題に遭遇しましたか。DB呼び出しとAD呼び出しを一緒にした場合の何が問題になっていますか。つまり、db呼び出しのすべての接続を閉じてから、Active Directory(AD)にアクセスしようとします。
どんな助けでも大歓迎です。
ありがとう、ディークシャ