私はこの奇妙な問題があります。私はActive Directory(AD)の電子メールグループ内のユーザーにデータベース内のユーザーを同期させるサービスを作成しようとしています。したがって、A、B、Cがデータベースにあり、アクティブディレクトリの電子メールグループがA & Eの場合、私はADを同期させます。だから私は 'E'を追加し、 'B'を削除します& 'C'。UserPrincipal.FindByIdentityは、SQLに関連するコールが存在する場合はnullを返し、それ以外の場合は正しいプリンシパルオブジェクトを返します。
データベースからユーザーを取得するには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電子メールグループに追加できます。問題は、ハードコーディングではなく、データベースから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]);
}
私の 'ユーザーが' ヌルとして戻って来ています。
誰も同じ問題が発生しましたか? DB呼び出しとAD呼び出しの何が問題なのですか?つまり、dbコールのすべての接続を閉じてから、Active Directory(AD)にアクセスしようとします。
何か助けていただければ幸いです。
おかげで、 ディクシャ
ありがとうございます。私は最小のケースにドリルダウンしようとし、DBからのユーザーIDが最後にスペースがあることがわかりました。 ありがとうございました。 –