1
我正在测试一个控制台应用程序实现的SQL Server数据库和Azure的活动目录(组,用户,组与组的关系,人与组的关系)AAD GraphClient API添加会员很慢
之间的同步我发现将用户添加到组是非常缓慢的。有关信息,我有一个容量约为20万的用户可以附加到约5000个组。
这里是我的代码示例一:
public static Dictionary<string, string> AddUsersToGroup(string groupName, string groupId, Dictionary<string, string> personToAddNames)
{
try
{
Dictionary<string, string> result = new Dictionary<string, string>();
bool l_contextChanged = false;
// Get the group from its name
Group group = SearchGroup(groupName, groupId);
if (group != null)
{
foreach (KeyValuePair<string, string> personName in personToAddNames)
{
// Get the user from its name
User person = SearchUser(personName.Value, personName.Key);
if (person != null)
{
try
{
// check if the user already belongs to the group
if (_fullSync || !ExistUserInGroup(group, person))
{
group.Members.Add(person);
l_contextChanged = true;
}
// Add the result to the dictionary (Argos Id + AAD Id)
result.Add(personName.Key, person.ObjectId);
}
catch (Exception e)
{
...
}
}
}
// Save all the modifications on the group
if (l_contextChanged)
{
group.UpdateAsync().Wait();
}
}
return result;
}
catch (Exception e)
{
...
}
}
是否有将用户添加到组,这将是另一种速度更快的方法?
UPDATE 我意识到通过将异步点应用于GraphClient API的操作但未获得性能的测试:6000个用户需要1小时。
据认为,一组中加入的人数是可变的,从1到X
这里是我的代码示例:
public static Dictionary<string, string> AddUsersToGroup(string nomGroupe, string idGroupe, Dictionary<string, string> listeNomPersonneAAjouter)
{
try
{
Dictionary<string, string> resultat = new Dictionary<string, string>();
bool l_contextChanged = true;
// Obtient le groupe depuis son nom pour avoir son id
Group groupePourAjoutUtilisateur = SearchGroup(nomGroupe, idGroupe);
if (groupePourAjoutUtilisateur != null)
{
Dictionary<Task<string>, string> l_taskNomPersonne = new Dictionary<Task<string>, string>();
foreach (KeyValuePair<string, string> nomMailPersonneAAjouter in listeNomPersonneAAjouter)
{
l_taskNomPersonne.Add(AddUserToGroupAsync(groupePourAjoutUtilisateur, nomMailPersonneAAjouter.Key, nomMailPersonneAAjouter.Value), nomMailPersonneAAjouter.Key);
}
Task.WaitAll(l_taskNomPersonne.Keys.ToArray());
foreach(KeyValuePair<Task<string>, string> l_task in l_taskNomPersonne)
{
resultat.Add(l_task.Value, l_task.Key.Result);
}
groupePourAjoutUtilisateur.UpdateAsync().Wait();
}
return resultat;
}
catch (Exception e)
{
throw new ApplicationException(String.Format("Impossible d'ajouter la liste d'utilisateur au groupe {0} - {1} {2}",
nomGroupe, e.Message, e.InnerException != null ? e.InnerException.Message : String.Empty));
}
}
public static async Task<string> AddUserToGroupAsync(Group groupePourAjoutUtilisateur, string nomPersonneAAjouter, string mailPersonneAAjouter)
{
string l_return = string.Empty;
// Obtient l'utilisateur depuis son nom pour avoir son id
User personneAAjouter = SearchUser(mailPersonneAAjouter, nomPersonneAAjouter);
if (personneAAjouter != null)
{
try
{
// On vérifie que la personne n'existe pas déjà dans le groupe
// si on est en exécution différentielle
if (_fullSync || !ExistUserInGroup(groupePourAjoutUtilisateur, personneAAjouter))
{
groupePourAjoutUtilisateur.Members.Add(personneAAjouter);
}
// retourne l'id AAD de la personne
l_return = personneAAjouter.ObjectId;
}
catch (Exception e)
{
Logs.Logger.Error(String.Format("Une erreur s'est produite lors du rattachement de l'utilisateur {0} au groupe {1}",
personneAAjouter.DisplayName, groupePourAjoutUtilisateur.DisplayName),
new Exception(String.Format("{0} - {1}", e.Message, e.InnerException.Message)));
}
}
return l_return;
}
你好,谢谢你的回答,我已经更新了我的帖子来回答你。 –