2

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

感谢您的帮助。

4

2 回答 2

9

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

幸运的是,Active Directory 有一种特殊类型的属性,称为构造属性。默认情况下,如果您使用 AD Explorer 或 ADSI Edit 浏览对象,则不会显示这些类型的属性。在 ADSI Edit 中,您可以设置过滤器以包括这些构造的属性。这里有用的构造属性之一是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,则表示它没有任何权限写入任何属性。我假设您的管理员将授予所有写入属性权限或拒绝所有写入属性。我认为在大多数情况下这是一个有效的假设。

于 2011-02-09T05:37:41.213 回答
0

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

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

于 2011-02-08T10:59:13.147 回答