首页 > 解决方案 > 比较两个文件夹的 ACL

问题描述

您如何比较两个不同文件夹的 AuthorizationRuleCollection?我想知道ACL是否相同。

我的解决方案是遍历每个项目并计算 IdentityReference.Value + AccessMask 的哈希值。然后将它们全部汇总并比较每个集合的总数。

有更好的方法吗?

标签: c#acl

解决方案


我会SequenceEqual从 LINQ 开始使用AuthorizationRuleCollectionimplements IEnumerable。唯一的问题是它AuthorizationRule没有覆盖object.Equals(),这意味着我们需要提供IEqualityComparer<AuthorizationRule>这样的自定义:

public class AuthorizationRuleEqualityComparer : IEqualityComparer<AuthorizationRule>
{
    public static readonly AuthorizationRuleEqualityComparer Instance = new AuthorizationRuleEqualityComparer();

    private AuthorizationRuleEqualityComparer()
    {
    }

    public bool Equals(AuthorizationRule l, AuthorizationRule r)
    {
        // Compare more fields if needed.
        return l.IdentityReference == r.IdentityReference;
    }

    public int GetHashCode(AuthorizationRule rule)
    {
        return rule.IdentityReference.GetHashCode();
    }
}

用法:

AuthorizationRuleCollection arc1;
AuthorizationRuleCollection arc2;
var equal = arc1
    .OfType<AuthorizationRule>()
    .SequenceEqual(
        arc2.OfType<AuthorizationRule>(),
        AuthorizationRuleEqualityComparer.Instance);

推荐阅读