首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GroupPrinciple.FindbyIdentity太慢了

GroupPrinciple.FindbyIdentity太慢了
EN

Stack Overflow用户
提问于 2015-06-12 23:04:38
回答 2查看 1.6K关注 0票数 1

我已经创建了一个功能,每次添加一个用户到特定的组(管理员等),但它似乎需要太长的时间来响应GroupPrinciple(5-10秒)和group.members.add(5-10秒)调用和减慢我的应用程序,它需要几乎15-20秒来响应,有没有更快的方法来做到这一点?

代码语言:javascript
运行
复制
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();

}
EN

回答 2

Stack Overflow用户

发布于 2015-06-12 23:38:21

我使用run in to this myself,因为您每次都使用相同的组,看看是否可以从添加用户和一次添加多个用户中重构出组的查找结果。

代码语言:javascript
运行
复制
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不是线程安全的,因此您需要锁定对类的修改。

代码语言:javascript
运行
复制
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线程上,用await _administratorsGroup替换_administratorsGroup.Result,它也具有相同的等待行为,但不会锁定您的UI。

票数 0
EN

Stack Overflow用户

发布于 2022-03-04 17:47:11

对于ContextType.Machine,FindAll()的速度要快得多。然后只需根据可用的输入过滤结果:NameUserPrincipalNameSAMAccountNameSid.Value

Linq变体,未经测试的ContextType.Domain:

代码语言:javascript
运行
复制
PrincipalContext principalContext = new PrincipalContext(ContextType.Machine);

// user (input: userSID)
PrincipalSearcher userPrincipalSearcher = new PrincipalSearcher(new UserPrincipal(principalContext));
UserPrincipal userPrincipal = userPrincipalSearcher.FindAll().FirstOrDefault(x => (x is UserPrincipal) && x.Sid.Value == userSID) as UserPrincipal;

// group (input: groupSID)
PrincipalSearcher groupPrincipalSearcher = new PrincipalSearcher(new GroupPrincipal(principalContext));
GroupPrincipal groupPrincipal = groupPrincipalSearcher.FindAll().FirstOrDefault(x => (x is GroupPrincipal) && x.Sid.Value == groupSID) as GroupPrincipal;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30806338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档