如何用PowerShell获取AD组testgroup1及其嵌套组的所有成员
获取AD组及其嵌套组的全部成员
要解决你遇到的Get-ADGroupMember只能返回直接成员的问题,这里有两种实用的方法可以获取testgroup1及其所有嵌套组的全部成员:
方法一:使用LDAP递归匹配规则(推荐,性能更优)
Active Directory内置了一个特殊的LDAP匹配规则1.2.840.113556.1.4.1941(又称LDAP_MATCH_RULE_IN_CHAIN),它能让AD服务器直接递归查询目标组下的所有嵌套成员,效率比本地递归高很多,适合大型AD环境。
查询所有嵌套用户成员
# 替换为你的组的完整LDAP路径,若组名在域内唯一,也可直接用组名 Get-ADUser -LDAPFilter "(memberOf:1.2.840.113556.1.4.1941:=CN=testgroup1,OU=Groups,DC=yourdomain,DC=com)"
查询所有类型的嵌套成员(用户、组、计算机)
如果需要获取所有类型的成员,改用Get-ADObject:
Get-ADObject -LDAPFilter "(memberOf:1.2.840.113556.1.4.1941:=CN=testgroup1,OU=Groups,DC=yourdomain,DC=com)" -Properties Name, ObjectClass | Select-Object Name, ObjectClass
方法二:自定义PowerShell递归函数(灵活可控)
如果你需要自定义处理逻辑(比如过滤特定成员类型、添加额外输出字段),可以写一个递归函数来遍历组结构:
function Get-NestedADGroupMembers { param( [Parameter(Mandatory=$true)] [string]$GroupName ) # 获取当前组的所有成员 $targetGroup = Get-ADGroup -Identity $GroupName -Properties Members foreach ($memberDN in $targetGroup.Members) { $member = Get-ADObject -Identity $memberDN -Properties Name, ObjectClass # 处理用户成员 if ($member.ObjectClass -eq 'user') { Get-ADUser -Identity $memberDN -Properties DisplayName, EmailAddress | Select-Object Name, DisplayName, EmailAddress } # 遇到嵌套组则递归查询 elseif ($member.ObjectClass -eq 'group') { Get-NestedADGroupMembers -GroupName $member.Name } # 可选:添加计算机成员的处理逻辑 # elseif ($member.ObjectClass -eq 'computer') { # Get-ADComputer -Identity $memberDN -Properties Name, DNSHostName | Select-Object Name, DNSHostName # } } } # 调用函数获取testgroup1的所有嵌套成员 Get-NestedADGroupMembers -GroupName "testgroup1"
你可以根据实际需求修改函数内部的逻辑,比如调整输出的属性、添加过滤条件等。
内容的提问来源于stack exchange,提问作者user9488111
相关产品推荐
相关产品推荐

