[英]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.