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