我正在尝试获取未禁用的 Active Directory 组成员用户列表。到目前为止,我能找到的最好的结果是:
dsquery group -name "Group name" | dsget group -members -expand | dsget user -samid -disabled -c | findstr /c:" no "
...承认最后的“findstr”完全是黑客行为(不幸的是,它还删除了列标题。)
我已经能够找到以下 dsquery 命令,它提供所有非禁用用户的列表:
dsquery * -filter "(&(sAMAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" -limit 0 | dsget user -samid -c
...但添加memberOf
参数仅适用于用户直接所属的组;它不会像 那样dsget group
递归-expand
。
那么有没有办法将它们结合起来,或者让 dsquery 递归,或者我在不使用 PowerShell 的情况下已经做到了极致?(我不能这样做,因为它的工具依赖于 Active Directory Web 服务,而至少从 Samba 4.9.5 开始,基于 Samba 的域控制器上不存在该服务。)
答案1
这个语法对我有用。它使用LDAP_MATCHING_RULE_IN_CHAIN规则 OID(1.2.840.113556.1.4.1941)检查对象的完整祖先:
dsquery * domainroot -limit 0 -r -filter "(&(objectCategory=user)(memberOf:1.2.840.113556.1.4.1941:=CN=Group Name,OU=Security Groups,DC=domain,DC=com)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"
确保将示例 distinguishedName 字符串 (memberOf=CN=Group Name,OU=Security Groups,DC=domain,DC=com) 替换为您要查询递归成员资格的组的 DN。
此查询返回组中每个已启用用户的 DN。如果您特别想获取 sAMAccountName 和国家/地区,请使用:
dsquery * domainroot -limit 0 -r -filter "(&(objectCategory=user)(memberOf:1.2.840.113556.1.4.1941:=CN=Group Name,OU=Security Groups,DC=domain,DC=com)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" -attr sAMAccountName co