【问题标题】:Check Authorization on ActiveDirectory Object检查 ActiveDirectory 对象的授权
【发布时间】:2011-07-22 05:46:25
【问题描述】:

我想测试任意用户是否对特定 Active Directory 对象的属性具有写访问权。我认为解决方案的一部分似乎是这样的:

NTAccount Account = new NTAccount("Domain\\XYZ");
SecurityIdentifier Sid =
(SecurityIdentifier)Account.Translate(typeof(SecurityIdentifier));

这似乎让我可以从用户的字符串表示中得到具体的表示。我认为的另一个难题是:

string strMemberString = "LDAP://OU=Test,DC=Domain,DC=local";
DirectoryEntry computers = new DirectoryEntry();
computers.Path = strMemberString;
computers.Options.SecurityMasks = SecurityMasks.Owner | SecurityMasks.Group
| SecurityMasks.Dacl | SecurityMasks.Sacl;

foreach (DirectoryEntry computer in computers.Children)
{
   if (computer.Name == "CN=Test")
   {
      ActiveDirectorySecurity sdc = computer.ObjectSecurity;
      //...

不知道从那里去哪里。我该如何完成这个?我应该追求一种完全不同的方式吗?我正在使用 .net 4.0。

我希望解决方案完全是 BCL 代码,而不是 PInvoke 或 WMI。

【问题讨论】:

  • 您是否知道“对特定 Active-Directory 对象的属性具有写访问权限”可能是由于属于某个组或属于某个组的组等导致的?跨度>
  • @JPBlanc:是的,我知道。那个“工作”应该由 BCL 为我处理。我只需要了解使用情况。
  • 我编辑了我的答案,您会找到检索用户所属安全组的方法。

标签: c# .net security active-directory authorization


【解决方案1】:

我认为最好的方法是寻找一个提供“有效权限”的类,如 AD 对象的安全选项卡中的高级对话框的选项卡所示:

它还存在一个名为ACLDiag.exe 的命令行工具,可以执行您想要的操作。


(已编辑) 要查找用户所属的组,您可以

  • 编写一个递归查询程序,它在大型组织中表现不佳。

  • 使用称为“LDAP_MATCHING_RULE_IN_CHAIN”的特殊匹配规则(请参阅Search Filter Syntax for more information)。我在this other question 中举了一个例子。它也有点长,但据我所知,这是检索安全和通讯组的唯一方法。

  • 使用“tokenGroups”属性。它是一个计算属性,包含用户所属的每个 SecurityGroup 的 id,包括间接组。我认为这是您可以使用的,它由 UserPrincipal.GetAuthorizationGroups 方法提供(在 System.DirectoryServices.AccountManagement 命名空间中并在 .Net 3.5 中引入)

【讨论】:

  • 我正在寻找一种程序化解决方案,而不是管理性解决方案,但无论如何感谢您。
【解决方案2】:

您需要检查 allowedAttributesEffective 属性。

【讨论】:

猜你喜欢
  • 2017-06-03
  • 1970-01-01
  • 2017-05-24
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 2016-12-27
  • 1970-01-01
相关资源
最近更新 更多