繁体   English   中英

如何使用C#检查用户是否在Active Directory中具有写权限?

[英]How can I check if a user has write rights in Active Directory using C#?

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

谢谢您的帮助。

就像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。 如果为null,则表示它没有任何写入任何属性的权限。 我假设您的管理员要么授予所有写属性权限,要么拒绝所有写属性。 我认为在大多数情况下这是一个有效的假设。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM