从给定AD组中的Active Directory获取用户列表

wcm*_*wcm 19 c# active-directory

我有搜索部门中所有用户的代码:

string Department = "Billing";
DirectorySearcher LdapSearcher = new DirectorySearcher();
LdapSearcher.PropertiesToLoad.Add("displayName");
LdapSearcher.PropertiesToLoad.Add("cn");
LdapSearcher.PropertiesToLoad.Add("department");
LdapSearcher.PropertiesToLoad.Add("title");
LdapSearcher.PropertiesToLoad.Add("memberOf");
LdapSearcher.Filter = string.Format("(&(objectClass=user)(department={0}))", Department);
SearchResultCollection src = LdapSearcher.FindAll();
Run Code Online (Sandbox Code Playgroud)

如果我只想要"经理只读"AD组中的每个人,那么过滤器需要看起来像什么?

我错了吗?

Dsc*_*duc 34

看看你的搜索,我有几个要点.首先,搜索使用objectClass(非索引)而不是objectCategory(索引).该查询存在巨大的性能问题.您总是希望将两者结合在一起,具体取决于您要检索的内容:

(&(objectCategory=person)(objectClass=user)) = All users (no contacts)
(&(objectCategory=person)(objectClass=contact)) = All contacts (no users)
(&(objectCategory=person)) = All users and contacts
Run Code Online (Sandbox Code Playgroud)

至于查找组中的用户,您可以枚举特定组的成员对象列表.在group对象的member属性中是每个用户的distinguishedName.

本文介绍枚举组的成员...

不要忘记您可能必须处理父组的嵌套组,因为没有使用LDAP查询处理此方法的默认方法.为此,您可能需要评估成员对象是否为组,然后获取该子组的成员属性.

最后,您应该养成为查询指定dns前缀的习惯.

没有DNS前缀:

LDAP://ou=ouname,dc=domain,dc=com
Run Code Online (Sandbox Code Playgroud)

使用DNS前缀(全部三个工作):

LDAP://servername/ou=ouname,dc=domain,dc=com
LDAP://servername.domain.com/ou=ouname,dc=domain,dc=com
LDAP://domain.com/ou=ouname,dc=domain,dc=com
Run Code Online (Sandbox Code Playgroud)

单个域不会给您带来太多问题,但是当您尝试在多域环境中运行搜索时,如果没有此添加,您将被咬住.希望这有助于让您更接近目标.


nzp*_*mad 11

我总是找到Howto :(几乎)通过C#在Active Directory中的一切都有助于解决大多数AD问题.

  • 这是一篇非常全面的文章,但我并没有特别找到这篇文章.这并不意味着它不存在,只是我看不到它.我现在正在玩弄十几件事...... (2认同)

Rob*_*ady 6

如果您已经知道该组的AD路径,则可能更容易在其上打开DirectoryEntry,然后从那里执行DirectorySearcher.

using (DirectoryEntry de = new DirectoryEntry("LDAP://somedomain/CN=FooBar"))
{
   DirectorySearcher search = new DirectorySearcher(de, ("(objectClass=user)"));
}
Run Code Online (Sandbox Code Playgroud)

搜索者还有一个标志,是否要钻到子容器,我忘了手边的名字.