【发布时间】:2011-06-23 08:25:16
【问题描述】:
在我的 .NET 2.0 C# 应用程序中,我需要确定用户(有密码)是否能够修改(写入)Active Directory 中的选项。我希望有一种方法可以使用 DirectoryEntry,而无需在 AD 中创建然后删除新对象。
感谢您的帮助。
【问题讨论】:
标签: c# .net active-directory directoryentry
在我的 .NET 2.0 C# 应用程序中,我需要确定用户(有密码)是否能够修改(写入)Active Directory 中的选项。我希望有一种方法可以使用 DirectoryEntry,而无需在 AD 中创建然后删除新对象。
感谢您的帮助。
【问题讨论】:
标签: c# .net active-directory directoryentry
就像 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,则表示它没有任何权限写入任何属性。我假设您的管理员将授予所有写入属性权限或拒绝所有写入属性。我认为在大多数情况下这是一个有效的假设。
【讨论】:
正如您在my question 中看到的那样,似乎不可能简单地找出随机用户对 AD 中特定对象的权限。
如果有人知道简单的方法,请告诉我。
【讨论】: