【问题标题】:How can I check if a user has write rights in Active Directory using C#?如何使用 C# 检查用户是否在 Active Directory 中具有写入权限?
【发布时间】:2011-06-23 08:25:16
【问题描述】:

在我的 .NET 2.0 C# 应用程序中,我需要确定用户(有密码)是否能够修改(写入)Active Directory 中的选项。我希望有一种方法可以使用 DirectoryEntry,而无需在 AD 中创建然后删除新对象。

感谢您的帮助。

【问题讨论】:

    标签: c# .net active-directory directoryentry


    【解决方案1】:

    就像 Olive 所说,自己很难做到正确。很难做到正确,因为权限可以通过 Active Directory 组传递到您的用户帐户。因此,为了找出特定用户帐户的有效权限,您必须找出该用户所属的所有组。

    幸运的是,Active Directory 有一种特殊类型的属性,称为构造属性。默认情况下,如果您使用 AD Explorer 或 ADSI Edit 浏览对象,则不会显示这些类型的属性。在 ADSI Edit 中,您可以设置 Filter 以包含这些构造的属性。这里有用的构造属性之一是 allowedAttributesEffective。它是一个多值属性,它包含您当前用户有权写入的所有属性。它是由 Active Directory 动态计算的。它负责所有继承、拒绝覆盖和组权限。如果您有权写入 cn 属性,您将看到 cn 作为其中的值之一。

    这是一个示例,用于检查特定用户对 Active Directory 上特定对象的特定属性集是否具有写入权限。

    static bool CheckWritePermission(string path, string username, string password, string[] properties)
    {
        using (DirectoryEntry de = new DirectoryEntry(path, username, password))
        {
            de.RefreshCache(new string[] {"allowedAttributesEffective"});
            return properties.All( property => de.Properties["allowedAttributesEffective"].Contains(property));
        }
    }
    

    是的,这不是您想要的。您要求检查用户是否具有 WriteAllProperties 权限。实际上,WriteAllProperties 权限是对不同属性的写属性权限的集合。您可能需要做一些功课来找出您的应用程序真正关心的属性。然后,只需传入这些属性。

    如果你真的不知道要检查什么属性,这个应该足够好了

    static bool CheckWritePermission(string path, string username, string password)
    {
        using (DirectoryEntry de = new DirectoryEntry(path, username, password))
        {
            de.RefreshCache(new string[] { "allowedAttributesEffective" });
            return de.Properties["allowedAttributesEffective"].Value != null;
        }            
    }
    

    在这里,我正在检查返回的 allowedAttributesEffective 是否为空。如果为 null,则表示它没有任何权限写入任何属性。我假设您的管理员将授予所有写入属性权限或拒绝所有写入属性。我认为在大多数情况下这是一个有效的假设。

    【讨论】:

    • 这看起来很有希望。看看我什么时候有时间检查这是否也适用于我的问题。但如果它真的像你描述的那样有效,我会喜欢这个功能。 ;-)
    • 谢谢哈维,这正是我想要的。正如您所写,只有两组用户。拥有完全访问权限的大师和拥有只读访问权限的用户。使用 DirectoryEntry 的 allowedAttributesEffective 属性,我能够在这些组之间进行确定。 ;-)
    【解决方案2】:

    正如您在my question 中看到的那样,似乎不可能简单地找出随机用户对 AD 中特定对象的权限。

    如果有人知道简单的方法,请告诉我。

    【讨论】:

    • 听起来您应该投票关闭作为重复项,而不是发布答案。人们没有理由让您知道这里而不是您已经提出的问题。
    • @Cody:我不认为这是一个真正的重复,因为这是一个问题,如果用户在特定位置具有写入权限。在我的问题中,我想知道特定用户的所有写访问位置。但这两个问题的根本问题是缺乏对所需功能的支持。
    • @Harvey:是的,它似乎有效。 :-) 我回答了我自己的问题,并在其中添加了您的学分,并在上面对您的答案进行了投票。
    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 2011-03-10
    • 2011-05-26
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多