我创建了一个函数,一次将一个用户添加到特定组(管理员等),但似乎需要花费很长时间来响应GroupPrinciple(5-10秒)和group.members.add(5-10秒)调用和减慢我的应用程序,响应需要将近15-20秒,有更快的方法吗?
private static void Add()
{
var userContext = new PrincipalContext(ContextType.Domain);
var user = new UserPrincipal(userContext);
user.SamAccountName = "c1111111";
var searcher = new PrincipalSearcher(user);
user = searcher.FindOne() as UserPrincipal;
var machineContext = new PrincipalContext(ContextType.Machine, "ABCDEFGHI1",
null, ContextOptions.Negotiate, "c123789", "test123");
var group = GroupPrincipal.FindByIdentity(machineContext,"Administrators");
group.Members.Add(user);
Console.WriteLine("saving group");
group.Save();
}
答案 0 :(得分:0)
我有run in to this myself,因为您每次都在使用相同的组,看看您是否可以通过添加用户重构该组的查找并一次添加多个用户。
private static void Add(IEnumerable<UserPrincipal> users)
{
var machineContext = new PrincipalContext(ContextType.Machine, "ABCDEFGHI1",
null, ContextOptions.Negotiate, "c123789", "test123");
var group = GroupPrincipal.FindByIdentity(machineContext,"Administrators");
foreach(var user in users)
{
group.Members.Add(user);
}
Console.WriteLine("saving group");
group.Save();
}
或者另一个选项是找到该组一次,然后缓存它。使用Task.Run
使这非常简单,只需在静态构造函数中启动任务,然后在Add函数中获取结果。 .Result
将阻止直到任务完成,然后在此之后立即执行。重要提示,GroupPrincipal
不是线程安全的,因此您需要锁定对类的修改。
static YourClassName()
{
_administratorsGroup = Task.Run(() =>
{
var machineContext = new PrincipalContext(ContextType.Machine, "ABCDEFGHI1",
null, ContextOptions.Negotiate, "c123789", "test123");
return GroupPrincipal.FindByIdentity(machineContext,"Administrators");
});
}
private static Task<GroupPrincipal> _administratorsGroup;
private static void Add(UserPrincipal user)
{
group = _administratorsGroup.Result;
lock(group)
{
group.Members.Add(user);
Console.WriteLine("saving group");
group.Save();
}
}
如果这将在UI线程上替换_administratorsGroup.Result
和await _administratorsGroup
,它也会有相同的等待行为,但不会锁定你的用户界面。