繁体   English   中英

如何将 LINQ“.Except()”与 AD 用户对象一起使用?

[英]how to use LINQ ".Except()" with AD user objects?

我在使用 LINQ .Except()子句时遇到问题。

我得到了一个唯一的、排序的、当前用户名的列表。 我可以在我们公司的 AD 中查找这些,并为每个生成一个UserPrinciple项目列表。 此列表将成为 AD 组的当前成员。

假设过去某个时间已经填充了 AD 组,我想使用当前用户的UserPrinciple列表修改成员资格。 我知道我可以adGroup.Members.Clear(); 然后遍历当前用户列表做adGroup.Member.Add(user); . 这需要一段时间,我希望可能有更有效的方法来做到这一点。

我找到了 LINQ .Except()子句,它看起来应该可以解决问题......如果我能让它工作的话。

我尝试了一些简单的示例,例如:

var t1 = new List<int>{1,2,3,4,5,6,7,8,9};
var t2 = new List<int>{1,55,9};
var t3 = new List<int>{9,8,7,6,5,4,3,2,1};

var t1_t2 = t1.Except(t2).ToList();
    // yeilds: 2,3,4,5,6,7,8

var t2_t1 = t2.Except(t1).ToList();
    // yeilds: 55

var t1_t3 = t1.Except(t3).ToList();
    // yeilds: empty list

但是,使用UserPrinciple列表尝试此操作的行为方式不同。

假设 AD 组和用户列表相同。 如果我尝试获取要从 AD 组中删除的项目列表,我会尝试:

using var ctx = new PrincipalContext(ContextType.Domain, null, "MyADuser", "a-password");

var groupDn =
    "CN=My Test Group,OU=Groups,OU=MyUnit,DC=ad,DC=MyCompany,DC=com";
    
using var group = GroupPrincipal.FindByIdentity(ctx, groupDn);

var userList = GetUserList();

var removeList = group.Members.Except(userList).ToList();

我希望removeList为空,但它包含所有成员记录。 同样,如果我朝另一个方向走:

var addList = userList.Except(group.Members).ToList();

我得到了整个成员列表。 我期望一个空列表。

我曾认为我可能需要实现IEqualityComparitor但我显然不够聪明,无法做到这一点。

我错过了什么? 我是否应该每次都对 AD 组进行平底船和.Clear()并重建它?

感谢@Ralf 的提示和一篇文章(来自 dotnettutorials.net ),我有了一个比较器。

编辑

private class MemberComparer : IEqualityComparer<Principal> {
    public bool Equals(Principal x, Principal y) {
        //First check if both object reference are equal then return true
        if (ReferenceEquals(x, y)) {
            return true;
        }

        //If either one of the object reference is null, return false
        if (x is null || y is null) {
            return false;
        }

        var xName = x.SamAccountName ?? "" + x.DistinguishedName ?? "";
        var yName = y.SamAccountName ?? "" + y.DistinguishedName ?? "";

        //Comparing all the properties one by one
        return xName == yName;
    }

    public int GetHashCode(Principal obj) {
        //Get the ID hash code value
        var idHashCode = obj.Sid == null ? 0 : obj.Sid.GetHashCode();

        //Get the Name HashCode Value
        var name = obj.SamAccountName ?? "" + obj.DistinguishedName ?? "";
        var nameHashCode = name == "" ? 0 : name.GetHashCode();

        return idHashCode ^ nameHashCode;
    }
}

这些编辑基于我们当地的广告专家关于使用哪些字段的一些建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM