我正在尝试在我使用的Powershell中获取用户所属的所有组,甚至是嵌套的组(重复地):
(Get-ADUser <username> -Properties MemberOf | Select-Object MemberOf).MemberOf
但它只返回用户是“直接”成员的组,就像使用 AD 用户控制台时获得的那样。所有组的单个列表非常有用,例如“gpresult -r”的输出,其中显示用户所属的所有组。
有没有办法从任何 AD 用户那里获取它? (不需要专门在Powershell中,也许还有另一个我还不知道的工具)
您可以使用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
或者,您可以使用 constructed attribute tokenGroups 和基本范围查询:
$tokenGroups = Get-ADUser -SearchScope Base -SearchBase '<account-distinguishedName>' `
-LDAPFilter '(objectClass=user)' -Properties tokenGroups | Select-Object `
-ExpandProperty tokenGroups | Select-Object -ExpandProperty Value
扩展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 页面