Используя порт GC, вы на правильном пути, поскольку он позаботится о вашем лесу.
Но проблема по-прежнему в принципах внешней безопасности. В документации для Get-ADGroupMember
говорится, что она выводит «основные объекты, представляющие пользователей, компьютеры или группы». Так что это будет работать только для тех трех типов объектов, а не для Foreign Security Principals.
Это, конечно, усложняет ситуацию по двум причинам:
- У вас нет возможности использовать свойство
-Recursive
, поэтому вам придется обрабатывать это вручную.
- Вам все еще нужно разрешить Принципы внешней безопасности.
Это подсказало мне, что мы можем использовать Get-ADObject
вместо.
Мне было скучно, поэтому я написал это для вас. У нас есть похожая настройка доменов, поэтому я смог ее протестировать. Но имейте в виду, что домены жестко закодированы. Предполагается, что любой иностранный субъект безопасности будет находиться в этом одном домене, а не в другом. Поэтому обязательно обновите доменные имена (3 места).
Он разрешает внешние учетные записи, беря objectSid
от Foreign Security Principal, который на самом деле является SID учетной записи во внешнем домене, и использует его для поиска пользователя в этом домене.
function Get-Members {
param([Microsoft.ActiveDirectory.Management.ADGroup]$group)
$members = $group | Select-Object -ExpandProperty Members | Get-ADObject -Server dc1:3268 -Properties Mail,SamAccountName,objectSid,ObjectClass
$returnMembers = New-Object System.Collections.ArrayList
foreach ($member in $members) {
if ($member.ObjectClass -eq "ForeignSecurityPrincipal") {
$returnMembers.Add((Get-ADUser -Server someOtherForest.com $member.objectSid -Properties Mail,SamAccountName)) | Out-Null
} elseif ($member.ObjectClass -eq "Group") {
$nestedMembers = (Get-Members ($member | Get-ADGroup -Properties Members))
if ($nestedMembers) {
if ($nestedMembers.Count -gt 1) {
$returnMembers.AddRange($nestedMembers) | Out-Null
} else {
$returnMembers.Add($nestedMembers) | Out-Null
}
}
} else {
$returnMembers.Add($member) | Out-Null
}
}
return $returnMembers
}
$Groups = Get-ADGroup -Server dc1:3268 -Properties Members -Filter * -SearchBase "CN=app-users,OU=app,DC=domain1,DC=acme,DC=com"
Foreach($G In $Groups) {
$members = Get-Members $G |Select-Object DistinguishedName,sAMAccountName, Mail |
Export-CSV -Path C:\output.csv -NoTypeInformation
}