如何使用Powershell或其他工具(递归)获取所有AD用户组?

问题描述 投票:0回答:3

我正在尝试在我使用的Powershell中获取用户所属的所有组,甚至是嵌套的组(重复地):

(Get-ADUser <username> -Properties MemberOf | Select-Object MemberOf).MemberOf

但它只返回用户是“直接”成员的组,就像使用 AD 用户控制台时获得的那样。所有组的单个列表非常有用,例如“gpresult -r”的输出,其中显示用户所属的所有组。

有没有办法从任何 AD 用户那里获取它? (不需要专门在Powershell中,也许还有另一个我还不知道的工具)

powershell active-directory active-directory-group
3个回答
36
投票

您可以使用LDAP_MATCHING_RULE_IN_CHAIN

Get-ADGroup -LDAPFilter "(member:1.2.840.113556.1.4.1941:=CN=User,CN=USers,DC=x)"

您可以在任何可以使用 LDAP 过滤器的地方使用它。

示例:

$username = 'myUsername'
$DN = (Get-ADUser $username).DistinguishedName
Get-ADGroup -LDAPFilter ("(member:1.2.840.113556.1.4.1941:={0})" -f $DN) | Select-Object -ExpandProperty Name | Sort-Object

6
投票

或者,您可以使用 constructed attribute tokenGroups 和基本范围查询:

$tokenGroups = Get-ADUser -SearchScope Base -SearchBase '<account-distinguishedName>' `
-LDAPFilter '(objectClass=user)' -Properties tokenGroups | Select-Object `
-ExpandProperty tokenGroups | Select-Object -ExpandProperty Value

1
投票

扩展user2871239回答关于使用

tokenGroups

递归获取所有 AD 对象组:

((Get-ADUser username | Get-ADUser -Properties tokenGroups).tokenGroups | Get-ADGroup).Name

或者,如果您不需要 ADGroup 对象,则返回一个字符串,但速度更快:

(Get-ADUser username | Get-ADUser -Properties tokenGroups).tokenGroups.Translate([System.Security.Principal.NTAccount]).Value

在我们的目录中几乎是瞬时的:

PS C:\windows\System32> (Get-ADUser -Filter *).Count
86816
PS C:\windows\System32> (Get-ADGroup -filter *).Count
1808
PS C:\windows\System32> (Get-ADComputer -filter *).Count
2666

仅供参考,这里是在这种情况下需要多少时间:

# this returns String objects
1..10 | % {
    Measure-Command {
        (Get-ADUser marcos | Get-ADUser -Properties tokenGroups).tokenGroups.Translate([System.Security.Principal.NTAccount]).Value
    }
} | Measure-Object -Average TotalSeconds | select @{l="Type";e={"String"}},Average

# this returns ADGroup objects
1..10 | % {
    Measure-Command {
        ((Get-ADUser marcossantos | Get-ADUser -Properties tokenGroups).tokenGroups | Get-ADGroup).Name
    }
} | Measure-Object -Average TotalSeconds | select @{l="Type";e={"ADGroup"}},Average

Type       Average
----       -------
String  0.01415692
ADGroup 0.25427236

这还会返回 PrimaryGroup 的嵌套成员身份(通常是域用户),而大多数解决方案都没有考虑到这一点。

此方法的一个缺点是它不检索通讯组。如果您需要,以下查询使用

LDAP_MATCHING_RULE_IN_CHAIN
仅返回通讯组(不过,比检索所有组快得多):

Get-ADGroup -LDAPFilter "(&(groupType>=0)(member:1.2.840.113556.1.4.1941:=CN=myuser,OU=MyUsers,DC=example,DC=com))"

代币组
LDAP_MATCHING_RULE_IN_CHAIN
有关 tokenGroups 的 Microsoft 页面

© www.soinside.com 2019 - 2024. All rights reserved.