Here is an example to query AD once and then work with the returned data
$groups = Get-ADGroup -Filter {GroupCategory -eq 'security'} -Properties member,memberof
$groups.member | ForEach-Object {
If ($groups.distinguishedname -contains $_) {
$current=$_
$groups | Where-Object {$_.member -contains $current} | Select-Object distinguishedname, samaccountname, @{Label='Type';Expression={"HasMember"}}, @{Label='RelativeGroup';Expression={$current}}
}
} | Select-Object * -Unique
$groups.memberof | ForEach-Object {
If ($groups.distinguishedname -contains $_) {
$current=$_
$groups | Where-Object {$_.memberof -contains $current} | Select-Object distinguishedname, samaccountname, @{Label='Type';Expression={"IsMemberOf"}}, @{Label='RelativeGroup';Expression={$current}}
}
} | Select-Object * -Unique
Results:
distinguishedname samaccountname Type RelativeGroup
----------------- -------------- ---- -------------
CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local Denied RODC Password Replication Group HasMember CN=Read-only Domain Controllers,CN=Users,DC=domain,DC=local
CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local Denied RODC Password Replication Group HasMember CN=Group Policy Creator Owners,CN=Users,DC=domain,DC=local
CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local Denied RODC Password Replication Group HasMember CN=Domain Admins,CN=Users,DC=domain,DC=local
CN=Administrators,CN=Builtin,DC=domain,DC=local Administrators HasMember CN=Domain Admins,CN=Users,DC=domain,DC=local
CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local Denied RODC Password Replication Group HasMember CN=Cert Publishers,CN=Users,DC=domain,DC=local
CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local Denied RODC Password Replication Group HasMember CN=Enterprise Admins,CN=Users,DC=domain,DC=local
CN=Administrators,CN=Builtin,DC=domain,DC=local Administrators HasMember CN=Enterprise Admins,CN=Users,DC=domain,DC=local
CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local Denied RODC Password Replication Group HasMember CN=Schema Admins,CN=Users,DC=domain,DC=local
CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local Denied RODC Password Replication Group HasMember CN=Domain Controllers,CN=Users,DC=domain,DC=local
CN=Users,CN=Builtin,DC=domain,DC=local Users HasMember CN=Domain Users,CN=Users,DC=domain,DC=local
CN=Guests,CN=Builtin,DC=domain,DC=local Guests HasMember CN=Domain Guests,CN=Users,DC=domain,DC=local
CN=Domain Controllers,CN=Users,DC=domain,DC=local Domain Controllers IsMemberOf CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local
CN=Domain Admins,CN=Users,DC=domain,DC=local Domain Admins IsMemberOf CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local
CN=Group Policy Creator Owners,CN=Users,DC=domain,DC=local Group Policy Creator Owners IsMemberOf CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local
CN=Read-only Domain Controllers,CN=Users,DC=domain,DC=local Read-only Domain Controllers IsMemberOf CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local
CN=Cert Publishers,CN=Users,DC=domain,DC=local Cert Publishers IsMemberOf CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local
CN=Schema Admins,CN=Users,DC=domain,DC=local Schema Admins IsMemberOf CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local
CN=Enterprise Admins,CN=Users,DC=domain,DC=local Enterprise Admins IsMemberOf CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local
CN=Domain Admins,CN=Users,DC=domain,DC=local Domain Admins IsMemberOf CN=Administrators,CN=Builtin,DC=domain,DC=local
CN=Enterprise Admins,CN=Users,DC=domain,DC=local Enterprise Admins IsMemberOf CN=Administrators,CN=Builtin,DC=domain,DC=local
CN=Domain Users,CN=Users,DC=domain,DC=local Domain Users IsMemberOf CN=Users,CN=Builtin,DC=domain,DC=local
CN=Domain Guests,CN=Users,DC=domain,DC=local Domain Guests IsMemberOf CN=Guests,CN=Builtin,DC=domain,DC=local
Of course you can limit it to just the distinguishedname and samaccountname if you like, but the above gives you more info at a glance.
$groups = Get-ADGroup -Filter {GroupCategory -eq 'security'} -Properties member,memberof
$groups.member | ForEach-Object {
If ($groups.distinguishedname -contains $_) {
$current=$_
$groups | Where-Object {$_.member -contains $current} | Select-Object distinguishedname, samaccountname, @{Label='Type';Expression={"HasMember"}}, @{Label='RelativeGroup';Expression={$current}}
}
} | Select-Object distinguishedname, samaccountname -Unique
$groups.memberof | ForEach-Object {
If ($groups.distinguishedname -contains $_) {
$current=$_
$groups | Where-Object {$_.memberof -contains $current} | Select-Object distinguishedname, samaccountname, @{Label='Type';Expression={"IsMemberOf"}}, @{Label='RelativeGroup';Expression={$current}}
}
} | Select-Object distinguishedname, samaccountname -Unique
Results:
distinguishedname samaccountname
----------------- --------------
CN=Denied RODC Password Replication Group,CN=Users,DC=domain,DC=local Denied RODC Password Replication Group
CN=Administrators,CN=Builtin,DC=domain,DC=local Administrators
CN=Users,CN=Builtin,DC=domain,DC=local Users
CN=Guests,CN=Builtin,DC=domain,DC=local Guests
CN=Domain Controllers,CN=Users,DC=domain,DC=local Domain Controllers
CN=Domain Admins,CN=Users,DC=domain,DC=local Domain Admins
CN=Group Policy Creator Owners,CN=Users,DC=domain,DC=local Group Policy Creator Owners
CN=Read-only Domain Controllers,CN=Users,DC=domain,DC=local Read-only Domain Controllers
CN=Cert Publishers,CN=Users,DC=domain,DC=local Cert Publishers
CN=Schema Admins,CN=Users,DC=domain,DC=local Schema Admins
CN=Enterprise Admins,CN=Users,DC=domain,DC=local Enterprise Admins
CN=Domain Users,CN=Users,DC=domain,DC=local Domain Users
CN=Domain Guests,CN=Users,DC=domain,DC=local Domain Guests