为了账号安全,请及时绑定邮箱和手机立即绑定

使用C#查找递归组成员身份(Active Directory)

使用C#查找递归组成员身份(Active Directory)

C#
蝴蝶刀刀 2019-12-16 16:12:20
我正在寻找用户在Active Directory中所属的所有组的列表,它们都在memberOf属性列表中显式列出,并且通过嵌套的组成员身份隐式列出。例如,如果我检查UserA并且UserA是GroupA和GroupB的一部分,那么如果GroupB是GroupC的成员,我也想列出GroupC。为了使您对我的应用程序有更多了解,我将在有限的基础上进行此操作。基本上,我偶尔需要进行安全检查,该检查将列出这些其他成员身份。我将要区分两者,但这并不难。我的问题是我还没有找到一种有效的方法来使此查询工作。Active Directory上的标准文本(此CodeProject文章)显示了一种执行此操作的方法,该方法基本上是递归查找。这似乎效率极低。即使在我的小型域中,用户也可能拥有30多个组成员身份。这意味着一个用户需要30多个Active Directory调用。我研究了以下LDAP代码以一次获取所有memberOf条目:(memberOf:1.2.840.113556.1.4.1941:={0})其中{0}是我的LDAP路径(例如:CN = UserA,OU = Users,DC = foo,DC = org)。但是,它不返回任何记录。即使该方法可行,它的缺点是我不知道哪个组是显式的,哪个组是隐式的。到目前为止,这就是我所拥有的。我想知道是否有比CodeProject文章更好的方法,如果可以的话,如何实现(实际代码会很棒)。我正在使用.NET 4.0和C#。我的Active Directory处于Windows 2008功能级别(尚不是R2)。
查看完整描述

3 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

递归使用ldap过滤器,但查询每次查询后返回的所有组,以减少往返次数。

例如:

  1. 获取用户所属的所有组

  2. 获取步骤1组为成员的所有组

  3. 获取步骤2组为成员的所有组

  4. ...

以我的经验,很少有超过5个,但绝对应该少于30个。

也:

  • 确保只拉回您需要的属性。

  • 缓存结果可以极大地提高性能,但会使我的代码复杂得多。

  • 确保使用连接池。

  • 主要小组必须分开处理



查看完整回答
反对 回复 2019-12-17
  • 3 回答
  • 0 关注
  • 375 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信