我对 LDAP 搜索有点问题,它应该指定用户是否是给定 AD 组的成员(递归)。
基本上,我所做的是使用以下参数发出 LDAP 搜索:
get-aduser -LDAPFilter "(memberof:1.2.840.113556.1.4.1941:={group LDAP path})" -SearchBase "{AD LDAP base}"
这确实产生了预期的结果:我没有获得我正在搜索的组的所有直接或间接成员,而是获得了该组的所有直接成员,以及随机选择的间接成员(被搜索组的成员)。
我得到的列表似乎是任意的:我找不到两个应该出现在结果集中的用户之间的组成员身份差异,但一个在那里,另一个不在。
(我需要通过 LDAP 搜索解决这个问题,因为结果将在应用程序中使用,而不是通过 powershell。但是以这种方式使用 powershell,我可以按照描述的方式重现原始问题)。
答案1
使用 Get-ADGroupMember 和 -Recursive 开关获取不包含子对象的所有成员的列表。这将深入到具有子对象的成员以获取其成员。
例子
$groupName = "Domain Admins"
$group = Get-ADGroup $groupName
$groupMembers = Get-ADGroupMember $group -Recursive
您需要查询组而不是用户,因为由于用户是嵌套组/角色/等的成员,memberOf 可能会给出不一致的结果。
答案2
使用 get-adobject(而不是 get-aduser)会得到相同的结果吗?
或者尝试使用 .NET Directory Searcher 对象
$rootDSE = [adsi]"LDAP://RootDSE"
$dnDomain = $rootDSE.defaultNamingContext
$search = New-Object DirectoryServices.DirectorySearcher([ADSI]"")
$search.searchroot = [adsi]"LDAP://$dnDomain"
$search.Filter = "(&(objectClass=user)(memberof:1.2.840.113556.1.4.1941:={group LDAP path}))"
$search.findAll()