缓慢的AD群组成员资格查找

时间:2016-04-04 09:57:18

标签: c# active-directory ldap-query

我有一些代码来检查域用户是否是计算机管理员组的成员:

public static bool ActiveDirectoryGroupMembershipOk(string userid, string groupName)
{
    using (PrincipalContext ctx = new PrincipalContext(ContextType.Machine, "my_pc_name"))
    {
        using (GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "administrators"))
        {
            if (grp != null)
            {
                foreach (Principal p in grp.GetMembers(false))
                {
                    if (p is UserPrincipal && p.SamAccountName.Equals(userid, StringComparison.InvariantCultureIgnoreCase))
                    {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}

它可以工作,但下面的代码行需要几秒钟才能完成:

using (GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "administrators"))

是否有更快的方式来查找会员资格?

我不知道它是否重要,但是userid是域用户,而Windows组是在本地PC上。

1 个答案:

答案 0 :(得分:0)

我找到了一个更好的方法来做到这一点(假设一个AD域),使用了Mr. Blonde的回答:

public static bool ActiveDirectoryGroupMembershipOk(String userid, String groupname)
{
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, userid);
    GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, groupname);

    return user.IsMemberOf(group);
}