我正在尝试运行 LDAP 过滤器以返回组内的所有用户。这很简单,而且有数百个 Stack Overflow 问题已经提供了示例查询。但是,我使用的过滤器很基础,在 Powershell 中运行时不会返回任何内容。
我尝试过的方法
Get-ADUser -LDAPFilter "(&(objectclass=user)(objectcategory=person)(memberOf=CN=MyGroup,OU=Users,DC=MyDomain,DC=com))"
我也尝试过“CN = Users”而不是“OU = Users
“MyGroup” 在 OU 中的位置:
“我的域名”(森林)>“用户”(开放大学)>“我的群组”(中国)
你知道我做错了什么吗?为什么“MyGroup”的 100-200 名成员都没有返回?
答案1
我要做的第一件事是仔细检查您要匹配的组的 DN 是否正确。我通常会这样做:
(Get-ADGroup MyGroup).distinguishedName
# optionally, save it to a variable
$groupDN = (Get-ADGroup MyGroup).distinguishedName
Get-ADUser
会将结果限制为用户对象,因此您可以忽略 LDAP 过滤器的 objectclass/objectcategory 部分,而只包含 memberOf 部分。您可以像这样使用我们之前设置的 DN 变量:
Get-ADUser -LDAPFilter "(memberOf=$groupDN)"
关于此特定查询,需要注意的重要一点是,它只会返回直接属于该群组的用户。它不会返回嵌套成员。因此,如果群组成员之一是另一个群组,则第二个群组的成员不会显示在结果中,除非您付出额外努力。您可以通过调整过滤器来获取这些嵌套成员,如下所示:
Get-ADUser -LDAPFilter "(memberOf:1.2.840.113556.1.4.1941:=$groupDN)"
中间那个奇怪的点号是 OID,叫做LDAP_MATCHING_RULE_IN_CHAIN. 来自文档:
LDAP_MATCHING_RULE_IN_CHAIN 是一个匹配规则 OID,旨在提供查找对象祖先的方法。许多使用 AD 和 AD LDS 的应用程序通常使用按父子关系排序的分层数据。以前,应用程序执行可传递的组扩展来确定组成员身份,这会占用过多的网络带宽;如果链接一直遍历到最后,应用程序需要进行多次往返才能确定对象是否“在链中”。
您的查询可能未返回结果的另一个原因是,如果您以某种原因运行查询的用户没有对部分/全部用户的读取权限。
答案2
Get-ADUser -properties memberof -filter * | 其中 -Property memberof -Contains ("CN=MyGroup,OU=Users,DC=MyDomain,DC=com")