用于枚举特定组的所有用户的 AD 查询语法是什么?

用于枚举特定组的所有用户的 AD 查询语法是什么?

以下是才不是迄今的工作;

(&(objectCategory=Person)(objectClass=Group)(CN=group_in_question))

(&(objectClass=Group)(objectCategory=Group)(成员=CN=group_in_question))

(&(samAccountName=%USERNAME%)(memberof=CN=group_in_question))

(&(objectCategory=person)(objectClass=user)(memberOf=cn=group_in_question,ou=Groups,dc=mydomain,dc=com))

答案1

对我来说,在 LDP.EXE 中针对我的一个域,第三个语法运行良好。我通常不会在其中放置 (objectCategory=person),但它也能很好地运行。

当您尝试使用它时,您会遇到什么样的错误?

答案2

对于此类查询,有几点需要考虑:

  1. 此查询可能返回多少个对象?
  2. 您是否想扩展群组成员的群组?
  3. 您是否需要处理任何“大型”团体(超过 1500 名成员)?

如果您的查询必须搜索大量用户数据库,则应始终包含“(ObjectCategory=person)”。这样做有几个原因。ObjectCategory 是索引属性,而 objectClass 不是,这将显著提高您在大型 AD 数据库上的查询速度。此外,同时使用 objectCategory 和 objectClass 属性将阻止在查询中返回“联系人”对象。

如果您的结果集将返回超过 1000 个结果,则需要注意性能问题。在 ADUC GUI 中,您可以通过“选项”对话框更改 2000 个项目的限制,增加该限制会大大减慢您的查询速度。如果您要使用 VBScript 并枚举 GetObject 结果,对于大型组来说,这也会非常非常慢。对于 Quest Powershell cmdlet,您需要包含“-sizelimit”参数来覆盖 1000 个项目的限制:

get-qadgroupmember somegroup -sizelimit 0

如果您使用代码(VBScript、JScript、.Net)创建连接对象并向其添加 LDAP 查询,则需要设置连接对象上的“.pageSize”属性以获取分页结果,因为默认情况下不返回分页结果,而是将其限制为 1000 个项目。我通常将 .pageSize 设置为 1000,因为这是最大值。

扩展嵌套组比较棘手。获取嵌套组信息的最简单方法是使用 Quest Powershell cmdlet:

get-qadgroupmember somegroup -indirect -sizelimit 0

您可以从 VBscript/JScript 脚本中使用“GetObject”枚举成员集合,测试每个成员是否为“用户或组”,然后递归到嵌套组中。这很慢,您不应该这样做,除非作为 VBScript 编程的练习。

最终,您可能希望了解如何通过直接 LDAP 查询来完成此操作。这可以通过LDAP_MATCHING_RULE_IN_CHAIN运算符。此运算符可能难以使用,并且如果您的组具有深层嵌套结构,则对 DC 来说可能非常昂贵。此方法的好处是,对于非常大的组(默认情况下超过 1500 个成员),您将能够查询属于该组(甚至间接)的用户,而不是检索组并尝试读取成员属性(必须对于“大型”群体采用特殊方法处理即,您会获得一份用户对象的报告,而不是您尝试读取大型属性数组的单个组对象。

(&(objectCategory=person)(objectClass=user)(memberof:1.2.840.113556.1.4.1941:=(cn=Group1,OU=groupsOU,DC=x)))

如果您在处理“大型”群组时遇到问题,您还可以增加 AD 在限制对 .member 属性的访问时使用的限制。

答案3

我认为问题是查找 A 组的所有用户而不是查找 A 用户是否属于 A 组的一部分?

如果你想找到一个组的所有成员使用

dsquery group -name "MyGroup" | dsget group -member

如果你想找到嵌套成员也可以使用

dsquery group -name "MyGroup" | dsget group -member -expand

如果成员超过 1000 或 1500 个,dsquery 可能不会提供结果,在这种情况下使用 adfind.exejoeware.net

ADFIND -f "&(objectcategory=group)(cn=MyGroup)" member 

答案4

以下是我通过 VBScript 使用过的内容:

枚举用户

   Dim objGroup
   Dim x 

   Set objGroup = Getobject ("LDAP: //CN=LocalGrp,OU=Staff, DC=net, DC=dom")
   For Each x In objGroup.Members
      WScript.Echo x.Class
      WScript.Echo x.Name
      WScript.Echo x.ADsPath
      WScript.Echo x.distinguishedName + vbCrLf
   Next

相关内容