簡體   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