[英]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.